【问题标题】:QWidget: Must construct a QApplication before a QPaintDeviceQWidget:必须在 QPaintDevice 之前构造一个 QApplication
【发布时间】:2020-02-05 16:22:46
【问题描述】:

首先,出于兼容性原因,我使用 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:如有翻译错误,请见谅。

【问题讨论】:

  • 正如错误所说,在创建 QApplication 之前,您不允许创建 QWidget(或任何 QPaintDevice)。但是如果没有产生问题的代码,除了重复错误消息之外,我看不出我们如何提供帮助......
  • 可能,当我试图修复它时,我搞砸了
  • 这个问题可能应该被删除,因为 O.P. 将他的代码发布到了一个临时的 pastebin(不再存在)。这真的不是一个有用的问题。

标签: python pyqt pyqt4


【解决方案1】:

从代码中,错误是由于第 102 行。在那里,当模块被加载时,您创建了一个 QWidget(更准确地说是一个 QMainWindow)。这发生在 QApplication 创建之前。

另外,我不知道你为什么有这个 start 变量,因为它似乎没有被使用。

如果要使用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 是创建初始屏幕的函数

【讨论】:

  • 主要思想是使用消息框启动应用程序,询问显示(全屏或正常模式)页面的方式,也可能是启动画面。无论如何,我解决了你所说的尝试非常感谢!
  • @bomba 如果我的解决方案有效,我会很感激你接受它
【解决方案2】:

我在运行 unittest 时遇到了错误。

QWidget: Must construct a QApplication before a QWidget

解决方案是为每个测试方法构建 QApplication。

app = QtWidgets.QApplication(sys.argv)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2023-03-12
    相关资源
    最近更新 更多