关闭 QMessagebox 窗口后 PyQt 应用程序崩溃
这是我的简单托盘应用程序的代码。当我从应用程序的上下文菜单中调用信息窗口然后将其关闭时,它会因段错误而崩溃。 我尝试了不同的变体来查找段错误的原因,这是我最后一次尝试。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
class SystemTrayIcon(QtGui.QSystemTrayIcon):
def __init__(self, parent=None):
QtGui.QSystemTrayIcon.__init__(self, parent)
self.setIcon(QtGui.QIcon("icon.png"))
self.iconMenu = QtGui.QMenu(parent)
appabout = self.iconMenu.addAction("About")
appexit = self.iconMenu.addAction("Exit")
self.setContextMenu(self.iconMenu)
self.aboutdialog = QtGui.QWidget(parent)
self.connect(appabout,QtCore.SIGNAL('triggered()'),self.showAbout)
self.connect(appexit,QtCore.SIGNAL('triggered()'),self.appExit)
self.show()
def showAbout(self):
QtGui.QMessageBox.information(self.aboutdialog, self.tr("About Tunarium"), self.tr("Your text here."))
def appExit(self):
sys.exit()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
trayIcon = SystemTrayIcon()
trayIcon.show()
sys.exit(app.exec_())
Here is the code of my simple tray application. It crashes with segfault when i call information window from context menu of application and then close it.
I've tryed different variants to find a reason of segfault, this is my last try.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore
from PyQt4 import QtGui
class SystemTrayIcon(QtGui.QSystemTrayIcon):
def __init__(self, parent=None):
QtGui.QSystemTrayIcon.__init__(self, parent)
self.setIcon(QtGui.QIcon("icon.png"))
self.iconMenu = QtGui.QMenu(parent)
appabout = self.iconMenu.addAction("About")
appexit = self.iconMenu.addAction("Exit")
self.setContextMenu(self.iconMenu)
self.aboutdialog = QtGui.QWidget(parent)
self.connect(appabout,QtCore.SIGNAL('triggered()'),self.showAbout)
self.connect(appexit,QtCore.SIGNAL('triggered()'),self.appExit)
self.show()
def showAbout(self):
QtGui.QMessageBox.information(self.aboutdialog, self.tr("About Tunarium"), self.tr("Your text here."))
def appExit(self):
sys.exit()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
trayIcon = SystemTrayIcon()
trayIcon.show()
sys.exit(app.exec_())
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不了解 Python,但在您的
appExit()
中,您应该在应用程序对象上调用quit()
或exit()
将导致您在 main 中调用sys.exit(app.exec_())
返回。同样,在不了解 Python 细节的情况下,您可以通过使用 Qt 宏 qApp 并调用 qApp->quit() 或 QCoreApplication::instance( )->quit()。调用
quit()
与调用exit(0)
相同。您可以直接使用exit()
返回您选择的任何退出代码。更新:
我已经在 C++ 中尝试过您的代码,并进行了一些调整,它确实有效。我已经评论了您应该尝试更改代码的位置。希望它对你有用。
更新 2:
根据要求,这里是等效的 C++ 代码:
main.cpp
SystemTrayIcon.h
SystemTrayIcon.cpp
I don't know Python but in your
appExit()
, you should be callingquit()
orexit()
on the application object which will cause your call tosys.exit(app.exec_())
in main to return. Again, not knowing the Python specifics, you can do this by using the Qt macroqApp
and callqApp->quit()
orQCoreApplication::instance()->quit()
.Calling
quit()
is the same as callingexit(0)
. You can useexit()
directly to return any exit code of your choice.Update:
I've tried your code in C++ with a few tweaks and it does work. I've commented where you should try making changes to your code. Hope it works for you.
Update 2:
As requested, here is the equivalent C++ code:
main.cpp
SystemTrayIcon.h
SystemTrayIcon.cpp