Windows 上的 PyQt4 应用程序在退出时崩溃

Posted

技术标签:

【中文标题】Windows 上的 PyQt4 应用程序在退出时崩溃【英文标题】:PyQt4 application on Windows is crashing on exit 【发布时间】:2011-07-27 06:43:11 【问题描述】:

我正在用 PyQt4 编写一个桌面应用程序,突然间它在退出时开始崩溃。

我检查了我的所有代码,以确保我没有做任何有趣的事情使其崩溃,并且我认为代码没有任何问题。

我之前看到过一些关于此的投诉,但它与以前的版本有关,人们建议将 PyQt4 升级到最新版本,所以我这样做了,但这对解决崩溃问题没有帮助。

所以我问,有什么东西可以导致 PyQt4 出现这种行为,我是否需要在终止程序上做一些事情来清理 Qt 或我遗漏的任何东西?

【问题讨论】:

在不知道您的程序中有什么的情况下,没有人可以回答这个问题。 至少,您应该处理一些可能导致崩溃的代码。没有人可以在没有任何线索的情况下回答您的问题。 我的代码没有什么特别之处。如果您只是在其中的每个选项卡上加载带有笔记本选项卡和表格视图的 .ui 并运行它,则应用程序可能会在退出时崩溃。在 Qt 清理时释放内存时似乎有些问题。 我还看到了与退出相关的崩溃,它们通常看起来是 PyQt 错误。我怀疑你会发现的唯一方法是使用调试器(如 gdb,而不是 python 调试器) 我还看到 pyqt 在退出时崩溃。使用 gdb 进行调试时,似乎崩溃发生在 tkinter 的某个地方(奇怪,因为我不使用 tkinter)。不过,它通常不会造成问题,所以我通常会忽略它。 【参考方案1】:

我在一个简单的 hello world 应用程序(带有 20 个标签的 QDialog)中遇到了同样的问题。奇怪的是,使用 10 个标签后问题就消失了。

我通过强制退出解决如下:

def closeEvent(self, event):
    exit()

这发生在 Windows 上,在 VirtualBox 上使用 PyQt v4.10.3 for Python v2.7 (x32)。

【讨论】:

谢谢,这对我有用!我正在使用 PyQt 4.11 x86,我遇到了同样的问题,当窗口关闭时 QDialog 开始崩溃。【参考方案2】:

调试器只会告诉我们我们已经知道的:应用程序在退出时崩溃。

您可能需要设置一个活动窗口,当它关闭时,将导致确定性垃圾收集和干净的应用程序退出。有更合适的方法可以做到这一点,但下面的简单示例应该需要最少的代码更改,并且基于我编写的对话应用程序并且工作正常。

#The application
app = QtGui.QApplication(sys.argv)

#The main window
MainWindow = QtGui.QMainWindow()
app.setActiveWindow(MainWindow) #<---- This is what's probably missing

#the ui
ui = Ui_MainWindow()
ui.setupUi(MainWindow)

#start the application's exec loop, return the exit code to the OS
exit(app.exec_())

【讨论】:

这完美解决了我在 PyQt 4.11.4 中也遇到的问题,非常感谢!

以上是关于Windows 上的 PyQt4 应用程序在退出时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OS X 上的 PyQt4 中更改应用程序菜单名称

使用 pyqt4 正确处理 Windows 操作系统缩放

loadFinished 完成后退出 PyQt4 应用程序

如何重启 PyQt4 应用程序

如何从 closeEvent 处理使用 PyQt4 检测注销/关闭?

windows下安装PyQt4