PyQt - PyQtGraph -> QWidget:必须在 QPaintDevice 之前构造一个 QApplication

PyQt - PyQtGraph -> QWidget: Must construct a QApplication before a QPaintDevice

目前正在尝试创建一个嵌入 PyQtGraph 图的 PyQt5 应用程序, 我已经在我的概念验证中做到了,现在尝试升级它。

我使用 GraphicsLayoutWidget 将我的图表嵌入 PyQt

但我有一条错误消息:

QWidget: Must construct a QApplication before a QPaintDevice. So i read about it, and it seem that my QApplication isn't created.

但我不明白,我有我的 mainWindow 运行 并且我尝试在按钮单击事件上添加 GraphicsLayoutWidget 所以我不明白为什么它没有'没用。

这个样本是运行良好的 POC

if __name__ == "__main__":

# set default pyqtgraph color
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)

global LeftPanelContent
LeftPanelContent = QtWidgets.QFrame()
LeftPanelContent.setMinimumSize(QtCore.QSize(200, 0))
LeftPanelContent.setMaximumSize(QtCore.QSize(200, 16777215))
LeftPanelContent.setObjectName("LeftPanelContent")

global PanelInfoPatient
PanelInfoPatient = QtWidgets.QFrame()
PanelInfoPatient.setMinimumSize(QtCore.QSize(250, 0))
PanelInfoPatient.setMaximumSize(QtCore.QSize(350, 16777215))
PanelInfoPatient.setObjectName("PanelInfoPatient")

#ui3 = Ui_MiddlePanel()
#ui3.setupUi(PanelInfoPatient)
ui3 = Ui_Form()
ui3.setupUi(PanelInfoPatient)
ui3.ButtonUpdate.clicked.connect(onUpdatePatientClicked)
ui3.ButtonDelete.clicked.connect(onDeletePatientClicked)


ui2 = Ui_LeftPanelContent()
ui2.setupUi(LeftPanelContent)
ui2.ButtonOrganisation.clicked.connect(showRightPanelCollapsible)
ui2.HideButton.clicked.connect(hideLeftPanels)

PanelRight = QtWidgets.QFrame()
PanelRight.setMinimumSize(QtCore.QSize(700, 0))
PanelRight.setObjectName("PanelRight") 

ui4 = Ui_RightPanel()
ui4.setupUi(PanelRight) 
ui4.widget_2 = pg.GraphicsLayoutWidget();
ui4.verticalLayout.addWidget(ui4.widget_2)
ui4.ButtonEvent.clicked.connect(onEventClicked);
ui4.ButtonDay.clicked.connect(onDayClicked);
ui4.ButtonWeek.clicked.connect(onWeekClicked);
ui4.ButtonMonth.clicked.connect(onMonthClicked);
ui4.widget_2.hide()

ui.gridLayout_2.addWidget(LeftPanelContent, 0, 0, 1, 1)
ui.gridLayout_2.addWidget(PanelInfoPatient, 0, 1, 1, 1)
ui.gridLayout_2.addWidget(PanelRight,  0, 2, 1, 1)


setMainWindowColor()
#MainWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint)
MainWindow.show()
sys.exit(app.exec_())

现在新的实现:

Launcher.py :

def launchApp(app):
    appController = ApplicationController()
    appController.showMainWindow()
    return app.exec_()

if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    setLangage()
    result = launchApp(app)
    sys.exit(result)

主窗口视图:

class MainWindow(QMainWindow, Ui_MainWindow, IMainWindows):

def __init__(self, parent=None):
    super(MainWindow, self).__init__(parent)
    self.setupUi(self)

    self.LeftPanelContent = None
    self.PanelInfoPatient = None
    self.PanelRight = None
    self.collaspedLeftPanel = None

    self.leftPanelUi = None
    self.panelInfoPatientUi = None
    self.rightPanelUi = None
    self.collaspedLeftPanelUi = None
    self.dialog = None
    self.lastDir = None

def guiAssemblage(self):

    pg.setConfigOption('background', 'w')
    pg.setConfigOption('foreground', 'k')

    self.LeftPanelContent = QtWidgets.QFrame()
    self.LeftPanelContent.setMinimumSize(QtCore.QSize(200, 0))
    self.LeftPanelContent.setMaximumSize(QtCore.QSize(200, 16777215))
    self.LeftPanelContent.setObjectName("LeftPanelContent")     

    self.PanelInfoPatient = QtWidgets.QFrame()
    self.PanelInfoPatient.setMinimumSize(QtCore.QSize(250, 0))
    self.PanelInfoPatient.setMaximumSize(QtCore.QSize(350, 16777215))
    self.PanelInfoPatient.setObjectName("PanelInfoPatient")

    self.PanelRight = QtWidgets.QFrame()
    self.PanelRight.setMinimumSize(QtCore.QSize(700, 0))
    self.PanelRight.setObjectName("PanelRight") 

    self.collaspedLeftPanel = QtWidgets.QFrame()
    self.collaspedLeftPanel.setMinimumSize(QtCore.QSize(75, 0))
    self.collaspedLeftPanel.setMaximumSize(QtCore.QSize(75, 16777215))
    self.collaspedLeftPanel.setObjectName("collaspedLeftPanel")  

    self.leftPanelUi = Ui_LeftPanelContent()
    self.leftPanelUi.setupUi(self.LeftPanelContent)

    self.panelInfoPatientUi = Ui_Form()
    self.panelInfoPatientUi.setupUi(self.PanelInfoPatient)

    self.rightPanelUi = Ui_RightPanel()
    self.rightPanelUi.setupUi(self.PanelRight) 

    self.collaspedLeftPanelUi = Ui_LeftPanelCollapsed()
    self.collaspedLeftPanelUi.setupUi(self.collaspedLeftPanel)

    self.gridLayout_2.addWidget(self.LeftPanelContent, 0, 0, 1, 1)
    self.gridLayout_2.addWidget(self.PanelInfoPatient, 0, 1, 1, 1)
    self.gridLayout_2.addWidget(self.PanelRight,  0, 2, 1, 1)

    self.dialog = QDialog()
    self.dialog.ui = Ui_popupDelete()
    self.dialog.ui.setupUi(self.dialog)
    self.dialog.setWindowTitle("Suppresion patient")

控制器:

class MainWindowController(object):

def __init__(self, appController):
    self.appController = appController
    self.model = None
    self.view = None

def run(self):
    self.view = MainWindow()
    self.view.show()
    self.view.guiAssemblage()

    self.connectSignals()

def createPlot(self):
    self.view.rightPanelUi.ContentRightPanel = pg.GraphicsLayoutWidget();
    self.view.rightPanelUi.verticalLayout.addWidget(self.view.rightPanelUi.ContentRightPanel)
    self.view.rightPanelUi.ContentRightPanel.hide()

def connectSignals(self):
    self.view.leftPanelUi.HideButton.clicked.connect(self.onHideLeftPanelClicked)
    self.view.panelInfoPatientUi.ButtonUpdate.clicked.connect(self.onUpdatePatientClicked)
    self.view.panelInfoPatientUi.ButtonDelete.clicked.connect(self.onDeletePatientClicked)  
    self.view.rightPanelUi.ButtonEvent.clicked.connect(self.onEventClicked);
    self.view.rightPanelUi.ButtonDay.clicked.connect(self.onDayClicked);
    self.view.rightPanelUi.ButtonWeek.clicked.connect(self.onWeekClicked);
    self.view.rightPanelUi.ButtonMonth.clicked.connect(self.onMonthClicked);

我也尝试在 guiAssemblage 方法中创建 GraphicsLayoutWidget 但我有同样的错误 请问我错过了什么?

所以我解决了我的问题。

我的 pyqtgraph 不是最新的。 不要使用不是最新的 PyPy 包。 我升级了 numpy,然后下载并用 GitHub 来源替换了我的 pyqtgraph 模块。

我还从我的计算机中删除了 PyQt5/PyQt4 和 PySide,然后重新安装 PyQt5

我尝试了几个解决方案直到这个堆栈:

C:\Users\Nicolas\Desktop\GitRepository\e-servicing\src (master)
λ pip install --upgrade pyqtgraph
Requirement already up-to-date: pyqtgraph in c:\python34\lib\site-packages
Requirement already up-to-date: numpy in c:\python34\lib\site-packages (from pyqtgraph)

C:\Users\Nicolas\Desktop\GitRepository\e-servicing\src (master)
λ python launcher.py
Traceback (most recent call last):
 File "C:\Python34\lib\site-packages\pyqtgraph\Qt.py", line 25, in <module>
import PyQt4
ImportError: No module named 'PyQt4'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Python34\lib\site-packages\pyqtgraph\Qt.py", line 29, in <module>
import PySide
ImportError: No module named 'PySide'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "launcher.py", line 9, in <module>
    import pyqtgraph as pg;
  File "C:\Python34\lib\site-packages\pyqtgraph\__init__.py", line 13, in <module>
from .Qt import QtGui
 File "C:\Python34\lib\site-packages\pyqtgraph\Qt.py", line 32, in <module>
raise Exception("PyQtGraph requires either PyQt4 or PySide; neither package could be imported.")
Exception: PyQtGraph requires either PyQt4 or PySide; neither package could be imported.

只需从 github 获取 PyQtGraph 源 成功了。