带有 PySide 2 和 QtDesigner 的 pyqtgraph

Posted

技术标签:

【中文标题】带有 PySide 2 和 QtDesigner 的 pyqtgraph【英文标题】:pyqtgraph with PySide 2 and QtDesigner 【发布时间】:2020-06-20 03:40:02 【问题描述】:

是“Promote To...”功能,在 pyqtgraph 0.10.0 文档中有描述:

http://www.pyqtgraph.org/documentation/how_to_use.html#embedding-widgets-inside-pyqt-applications

还使用 PySide2 和 pyqtgraph 最近的开发分支?当我使用 QtDesigner 创建一个 .ui 文件并按照“Promote to...”说明进行操作时,小部件中不会显示任何 pyqtgraph:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys

from PySide2 import QtWidgets, QtUiTools, QtCore
import pyqtgraph as pg


def load_ui(fname):
    fd = QtCore.QFile(fname)
    fd.open(QtCore.QFile.ReadOnly)
    loader = QtUiTools.QUiLoader()
    window = loader.load(fd)
    fd.close()
    return window


class First:
    def __init__(self):
        self.window = load_ui('test.ui')

    def show(self):
        self.window.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    main = First()  
    main.show()

    sys.exit(app.exec_())

在 PyQt5 和 pyqtgraph 0.10.0 中,这确实有效:小部件将显示为一个空的 pyqtgraph 图。

编辑:

这里是 test.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>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="PlotWidget" name="Graph">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>20</y>
      <width>701</width>
      <height>501</height>
     </rect>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <customwidgets>
  <customwidget>
   <class>PlotWidget</class>
   <extends>QGraphicsView</extends>
   <header>pyqtgraph</header>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

【问题讨论】:

【参考方案1】:

PySide2 仅适用于开发分支,因此您必须安装它:

git clone -b develop git@github.com:pyqtgraph/pyqtgraph.git
python setup.py install

另一方面,QUiLoader 不知道 PlotWidget,所以你必须重写 createWidget 方法:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import sys

from PySide2 import QtWidgets, QtUiTools, QtCore
import pyqtgraph as pg

DIR_PATH = os.path.dirname(os.path.realpath(__file__))


class UiLoader(QtUiTools.QUiLoader):
    def createWidget(self, className, parent=None, name=""):
        if className == "PlotWidget":
            return pg.PlotWidget(parent=parent)
        return super().createWidget(className, parent, name)


def load_ui(fname):
    fd = QtCore.QFile(fname)
    if fd.open(QtCore.QFile.ReadOnly):
        loader = UiLoader()
        window = loader.load(fd)
        fd.close()
        return window


class First:
    def __init__(self):
        self.window = load_ui(os.path.join(DIR_PATH, "test.ui"))

    def show(self):
        self.window.show()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

【讨论】:

不幸的是,小部件中仍然没有 pyqtgraph 图。

以上是关于带有 PySide 2 和 QtDesigner 的 pyqtgraph的主要内容,如果未能解决你的问题,请参考以下文章

将图形嵌入 GUI(Qtdesigner 和 Pyside)

pyside2pycharm关联方法

尝试复制 pyside 对象时出现问题

PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用

Qt Designer - 只生成一个带有多个小部件的 .ui 文件

使用 Qt Designer 在 PySide2 中实现信号/插槽时出错