python - 在pyqtgraph中绘制一个矩形
问题描述
我正在尝试在 pyqtgraph 中绘制矩形以显示二维数组中的数据,它位于设计器中创建的窗口内。有没有办法绘制一个矩形并将对象保存到二维数组中,以便我以后可以更新它的颜色?我尝试按照自定义绘图示例进行操作,但我不断收到以下错误:
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>
解决方案
正如文档指出的那样, addItem 方法需要一个图形项:
将图形项添加到视图框。如果项目有绘图数据(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()
推荐阅读
- variables - 如何在 Jmeter 中将变量设置为自定义函数?
- php - PHP:如何使用 SOAP 访问存在于不同服务器上的类方法
- insert - 为 DataGrip 生成 sql 插入
- python - 单击按钮后使用python selenium将文件上传到webApp,文件选择窗口出现
- mysql - PhpStorm 无法识别“IF NOT EXISTS”sql 请求
- java - Convert Object to Class Type
- javascript - vuejs - 带有谷歌地图的 Safari 浏览器导航
- c# - 如何使用 LINQ 更改字符串列表?
- javascript - 用户单击加号时如何添加更多输入字段
- python - 无法导入 cv2 模块(Python 3.6)