在pyqtgraph中绘制一个矩形

用户名

我正在尝试在pyqtgraph中绘制矩形以显示2D数组中的数据,它位于设计器中创建的窗口内。有没有办法绘制一个矩形并将对象保存到2D数组,以便以后可以更新其颜色?我尝试按照自定义绘图示例进行操作,但始终收到以下错误:

AttributeError: 'QRectF' object has no attribute 'zValue'
def Draw2DSquare(self):
    self.picture = QtGui.QPicture()
    p = QtGui.QPainter(self.picture)
    p.setPen(pg.mkPen('w'))
    p.drawLine(QtCore.QPointF(0, 0), QtCore.QPointF(1, 1))
    p.setBrush(pg.mkBrush('g'))
    p.drawRect(QtCore.QRectF(0, 0, 4.5, 4.5))
    p.end()
    self.graphWidget_2D.addItem(QtCore.QRectF(self.picture.boundingRect()))

我不知道这是否是最好的方法。有没有更简单的方法来绘制矩形?

这是我的python文件:

import time
from PyQt5 import QtWidgets, uic, QtGui, QtCore
import pyqtgraph as pg
import pyqtgraph.opengl as gl
import sys
import numpy as np
from PyQt5.QtGui import QIcon, QKeySequence
from PyQt5.QtWidgets import QAction

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        # Load the UI Page
        uic.loadUi('help.ui', self)
        self.showMaximized()
        self.Draw2DSquare()

    def Draw2DSquare(self):
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('w'))
        p.drawLine(QtCore.QPointF(0, 0), QtCore.QPointF(1, 1))
        p.setBrush(pg.mkBrush('g'))
        p.drawRect(QtCore.QRectF(0, 0, 4.5, 4.5))
        p.end()
        self.graphWidget_2D.addItem(QtCore.QRectF(self.picture.boundingRect()))

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

这是我的ui文件,名为help.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1120</width>
    <height>833</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <widget class="PlotWidget" name="graphWidget_2D" native="true"/>
    </item>
    <item row="0" column="1">
     <widget class="GLViewWidget" name="graphWidget_3D" native="true"/>
    </item>
    <item row="1" column="0">
     <spacer name="horizontalSpacer">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>40</width>
        <height>20</height>
       </size>
      </property>
     </spacer>
    </item>
    <item row="1" column="1">
     <spacer name="horizontalSpacer_2">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="sizeHint" stdset="0">
       <size>
        <width>40</width>
        <height>20</height>
       </size>
      </property>
     </spacer>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1120</width>
     <height>21</height>
    </rect>
   </property>
   <widget class="QMenu" name="menuFile">
    <property name="title">
     <string>File</string>
    </property>
    <addaction name="actionFile"/>
    <addaction name="actionOpen"/>
    <addaction name="actionSave"/>
    <addaction name="separator"/>
    <addaction name="actionOptions"/>
    <addaction name="separator"/>
    <addaction name="actionExit"/>
   </widget>
   <addaction name="menuFile"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
  <action name="actionOpen">
   <property name="text">
    <string>Open</string>
   </property>
  </action>
  <action name="actionFile">
   <property name="text">
    <string>File</string>
   </property>
  </action>
  <action name="actionOptions">
   <property name="text">
    <string>Options</string>
   </property>
  </action>
  <action name="actionSave">
   <property name="text">
    <string>Save</string>
   </property>
  </action>
  <action name="actionExit">
   <property name="text">
    <string>Exit</string>
   </property>
  </action>
 </widget>
 <customwidgets>
  <customwidget>
   <class>PlotWidget</class>
   <extends>QWidget</extends>
   <header>pyqtgraph.h</header>
   <container>1</container>
  </customwidget>
  <customwidget>
   <class>GLViewWidget</class>
   <extends>QWidget</extends>
   <header>pyqtgraph.opengl.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>
永乐

docs指出,addItem方法需要一个图形项

addItem(item,* args,** kargs)

图形项添加到视图框中。如果项目具有绘图数据(PlotDataItem,PlotCurveItem,ScatterPlotItem),则可以将其包含在由PlotItem执行的分析中。

(强调我的)

但是您传递的不是QRectF。您可以使用QGraphicsRectItem,但是场景的坐标与视框的坐标不匹配,因此您将必须基于GraphicsObject实现自定义图形项(作为我采用官方示例的基础):

import sys

from PyQt5 import QtCore, QtGui, QtWidgets, uic

import pyqtgraph as pg


class RectItem(pg.GraphicsObject):
    def __init__(self, rect, parent=None):
        super().__init__(parent)
        self._rect = rect
        self.picture = QtGui.QPicture()
        self._generate_picture()

    @property
    def rect(self):
        return self._rect

    def _generate_picture(self):
        painter = QtGui.QPainter(self.picture)
        painter.setPen(pg.mkPen("w"))
        painter.setBrush(pg.mkBrush("g"))
        painter.drawRect(self.rect)
        painter.end()

    def paint(self, painter, option, widget=None):
        painter.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        return QtCore.QRectF(self.picture.boundingRect())


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        # Load the UI Page
        uic.loadUi("help.ui", self)
        self.showMaximized()
        self.draw_2d_square()

    def draw_2d_square(self):
        rect_item = RectItem(QtCore.QRectF(0, 0, 4.5, 4.5))
        self.graphWidget_2D.addItem(rect_item)


def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在颤动中绘制一个矩形的半圆?

来自分类Dev

试图绘制一个矩形(位图)

来自分类Dev

在Android中创建一个由可绘制矩形包围的圆

来自分类Dev

如何在imageViews数组中的每个imageView周围绘制一个矩形?

来自分类Dev

我想在 UWP 中通过触摸绘制一个矩形

来自分类Dev

当从另一个窗体触发按钮单击事件时,在窗体的面板中绘制一个矩形

来自分类Dev

在GLUT中用鼠标绘制一个矩形

来自分类Dev

用pixi.js绘制一个矩形

来自分类Dev

在Windows窗体上绘制一个移动的矩形

来自分类Dev

在透明窗口中绘制一个半透明矩形

来自分类Dev

将多个矩形绘制到一个JPanel

来自分类Dev

用pixi.js绘制一个矩形

来自分类Dev

相对于表单大小绘制一个矩形

来自分类Dev

使用 Core Graphics 在 UIImageView 上绘制一个矩形

来自分类Dev

在图像android上绘制一个矩形

来自分类Dev

如何绘制一个矩形到脸部的位置?

来自分类Dev

Delphi绘制一个具有两个圆角和矩形角的闭合矩形

来自分类Dev

Delphi绘制一个具有两个圆角和矩形角的闭合矩形

来自分类Dev

在另一个矩形中居中矩形

来自分类Dev

创建下一个矩形时,始终会删除绘制的矩形

来自分类Dev

QT5:使用drawPixMap()在另一个矩形的顶部绘制矩形

来自分类Dev

如何在pyqtgraph的一个轴上绘制两个barh?

来自分类Dev

在起点处绘制一个矩形,然后跟随我的动作在Swift中结束手势

来自分类Dev

如何在xml drawable android中绘制一个矩形内端三角形形状?

来自分类Dev

在mousemove上绘制一个矩形,并使用dynamicjs在mouseup上选择该矩形内的所有形状?

来自分类Dev

Java分组点可以落在一个矩形中

来自分类Dev

在Pygame中旋转一个矩形(不是图像)

来自分类Dev

在 C 中实现一个非矩形数组

来自分类Dev

在javafx中添加一个矩形到root

Related 相关文章

  1. 1

    如何在颤动中绘制一个矩形的半圆?

  2. 2

    试图绘制一个矩形(位图)

  3. 3

    在Android中创建一个由可绘制矩形包围的圆

  4. 4

    如何在imageViews数组中的每个imageView周围绘制一个矩形?

  5. 5

    我想在 UWP 中通过触摸绘制一个矩形

  6. 6

    当从另一个窗体触发按钮单击事件时,在窗体的面板中绘制一个矩形

  7. 7

    在GLUT中用鼠标绘制一个矩形

  8. 8

    用pixi.js绘制一个矩形

  9. 9

    在Windows窗体上绘制一个移动的矩形

  10. 10

    在透明窗口中绘制一个半透明矩形

  11. 11

    将多个矩形绘制到一个JPanel

  12. 12

    用pixi.js绘制一个矩形

  13. 13

    相对于表单大小绘制一个矩形

  14. 14

    使用 Core Graphics 在 UIImageView 上绘制一个矩形

  15. 15

    在图像android上绘制一个矩形

  16. 16

    如何绘制一个矩形到脸部的位置?

  17. 17

    Delphi绘制一个具有两个圆角和矩形角的闭合矩形

  18. 18

    Delphi绘制一个具有两个圆角和矩形角的闭合矩形

  19. 19

    在另一个矩形中居中矩形

  20. 20

    创建下一个矩形时,始终会删除绘制的矩形

  21. 21

    QT5:使用drawPixMap()在另一个矩形的顶部绘制矩形

  22. 22

    如何在pyqtgraph的一个轴上绘制两个barh?

  23. 23

    在起点处绘制一个矩形,然后跟随我的动作在Swift中结束手势

  24. 24

    如何在xml drawable android中绘制一个矩形内端三角形形状?

  25. 25

    在mousemove上绘制一个矩形,并使用dynamicjs在mouseup上选择该矩形内的所有形状?

  26. 26

    Java分组点可以落在一个矩形中

  27. 27

    在Pygame中旋转一个矩形(不是图像)

  28. 28

    在 C 中实现一个非矩形数组

  29. 29

    在javafx中添加一个矩形到root

热门标签

归档