使用 pyside2 将 pyqtgraph 图添加到 QTDesigner

Posted

技术标签:

【中文标题】使用 pyside2 将 pyqtgraph 图添加到 QTDesigner【英文标题】:add pyqtgraph plot to QTDesigner with pyside2 【发布时间】:2020-03-23 03:29:54 【问题描述】:

我有一个带有 QVBoxLayout 的 QTDesigner 文件,我尝试在其中添加一个 GLViewWidget:

我使用这个Embed Pyqtgraph to PySide2 示例来创建我的代码。 在我的应用程序中,所有这些都嵌入在 ROS 环境中。 QTDesigner QVBoxLayout:

...
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <property name="leftMargin">
          <number>10</number>
         </property>
         <property name="topMargin">
          <number>10</number>
         </property>
         <property name="rightMargin">
          <number>10</number>
         </property>
         <property name="bottomMargin">
          <number>10</number>
         </property>
         <item>
          <spacer name="verticalSpacer">
           <property name="orientation">
            <enum>Qt::Vertical</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>10</width>
             <height>10</height>
...

我尝试通过 addWidget 函数将 GLViewWidget 添加到 QVBoxLayout:

#!/usr/bin/env python2

# ROS imports
import rospkg
import rospy

# QT imports
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile, QObject
import pyqtgraph.opengl as pg
from pyqtgraph.Qt import QtCore
import ros_numpy

class ConfigUi(QObject):

    def __init__(self, subscriber, parent=None):
        super(ConfigUi, self).__init__(parent)
        r = rospkg.RosPack()

        pkg_path = r.get_path('config_ui')
        ui_file = QFile(pkg_path + '/ui/main_window.ui')
        ui_file.open(QFile.ReadOnly)
        loader = QUiLoader()

        self.subscriber = subscriber

        self.window = loader.load(ui_file)
        self.gv = self.window.verticalLayout_2
        self.w = self.plotWidget()
        self.gv.addWidget(self.w)
        self.w.show()

    def plotWidget(self):
        w = pg.GLViewWidget()
        w.opts['distance'] = 20
        w.setWindowTitle('pyqtgraph example: GLScatterPlotItem')

        self.sp3 = pg.GLScatterPlotItem(pos=ros_numpy.point_cloud2.pointcloud2_to_xyz_array(self.subscriber.pc),
                                        color=(1, 1, 1, .3), size=0.01, pxMode=False)
        w.addItem(self.sp3)
        t = QtCore.QTimer()
        t.timeout.connect(self.update)
        t.start(50)
        return w

    def update(self):
        pc = ros_numpy.point_cloud2.pointcloud2_to_xyz_array(self.subscriber.pc)
        self.sp3.setData(pos=pc)
if __name__ == '__main__':

    listener = CameraListner()

    app = QApplication(sys.argv)
    window = ConfigUi(subscriber)

    sys.exit(app.exec_())

启动后出现错误:

TypeError: 'PySide2.QtWidgets.QBoxLayout.addWidget' called with wrong argument types:
  PySide2.QtWidgets.QBoxLayout.addWidget(GLViewWidget)
Supported signatures:
  PySide2.QtWidgets.QBoxLayout.addWidget(PySide2.QtWidgets.QWidget, int = 0, PySide2.QtCore.Qt.Alignment = 0)

感谢您的帮助。

【问题讨论】:

你使用的是什么版本的 PySide2、pyqtgraph 和 python?尝试使用最新版本的 PySide2 和 pyqtgraph。 嘿,我用的是 pygraph 版本 0.11.0.dev0+gdb483f8 嘿,您找到解决问题的方法了吗,我正在为同样的问题苦苦挣扎。如果您有任何解决方案,请回复我.. 【参考方案1】:

我是使用 pyqtgraph 字节的新手,通过首先在 Qt 设计器中放置对象名称为“plotwidget”的 QWidget,成功地在条形图中绘制值列表。然后将此 Qwidget 提升为 pyqtgraph.PlotWidget 类。绘制我的条的代码很简单:

bg = pg.BarGraphItem(x=range(len(value_list)), height=value_list, width=0.8, brush='b')
self.ui.plotwidget.addItem(bg)

我会尝试在 Qt Designer 中将 QWidget 提升为 GLViewWidget,然后添加 GLScatterPlotItem,就像我在代码中使用 BarGraphItem 一样。

我使用 pyqtpgraph 0.11.0rc0 和 Pyside2 5.13.1

【讨论】:

以上是关于使用 pyside2 将 pyqtgraph 图添加到 QTDesigner的主要内容,如果未能解决你的问题,请参考以下文章

使用 PySide2 在 Qt-Designer 中嵌入 PyQtGraph

在 PyQtGraph 和 PySide2 中使用 ImageView 修复文本位置

PySide2 中的 QGraphicsItem.itemClipsChildrenToShape 问题

带有 PySide 2 和 QtDesigner 的 pyqtgraph

带有 Pyside2 和 Matplotlib 的 Pyinstaller 无法正常工作

❤️GUI可视化利器,让实时数据可视化so easy