QWidget:必须在QPaintDevice之前构造一个QApplication

问题描述 投票:4回答:2

首先,出于兼容性原因,我将Windows 7-64位与PyQwt5.2.0,PyQt4.5.4,NumPy1.3.0,python2.6.2 32位一起使用。

运行我的脚本时,出现:

QWidget: Must construct a QApplication before a QPaintDevice

[网上冲浪,寻找某种修复方法,我发现QWidget继承了QObjectQPaintDevice(并且几乎被我使用的每个对象都继承了),QMainWindow继承了QWidget。我还得到一些静态函数正在尝试使用某些类,但我并不真正理解它的含义。

[如果有人可以解释一下,我将非常感谢。

PS:对不起,任何翻译错误。

python pyqt pyqt4
2个回答
6
投票

从代码中,错误是由于第102行引起的。在那里,在加载模块时,您将创建一个QWidget(更确切地说是QMainWindow)。并且发生这种情况之前创建了QApplication

而且,我不知道为什么在这里有这个起始变量,因为它似乎没有被使用。

如果要使用HelloBegin对象创建它,请以__init__方法移动它。

编辑:

如果要在模块加载时显示初始屏幕,则需要由一个小型,轻量级的模块启动该应用程序。在此模块中,您将:

  1. 创建QApplication
  2. 打开初始屏幕/消息框
  3. 仅然后加载其他模块

为了使一切顺利进行,我将模块导入一个单独的函数中,并使用一个小技巧来确保仅在GUI准备好后才能启动。代码将如下所示:

from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QTimer
def startApp():
    import m1
    import m2
    wnd = createWindow()
    wnd.show()
import sys
app = QApplication(sys.argv)
splash = createSplashScreen()
splash.show()
QTimer.singleShot(1, startApp) # call startApp only after the GUI is ready
sys.exit(app.exec_())

其中createSplashScreen是创建初始屏幕的功能


0
投票

我在运行unittest时遇到错误。

QWidget: Must construct a QApplication before a QWidget

解决方案正在为每种测试方法构建QApplication。

app = QtWidgets.QApplication(sys.argv)
© www.soinside.com 2019 - 2024. All rights reserved.