带有 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)
PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用