当以下代码运行时,托盘应用程序可以在屏幕中间弹出AboutWindow QLabel对象。但是当关闭此屏幕时,整个应用程序将关闭,没有错误(托盘图标消失,控制台日志显示没有任何错误)。
import sys
from PyQt4 import QtGui, QtCore
class AboutWindow(QtGui.QLabel):
def __init__(self, parent=None):
QtGui.QLabel.__init__(self, parent=parent)
self.setText("""
Huge text goes here
""")
class SystemTrayIcon(QtGui.QSystemTrayIcon):
def __init__(self, icon, parent=None):
QtGui.QSystemTrayIcon.__init__(self, icon, parent)
menu = QtGui.QMenu(parent)
self.createMenuActions(menu)
self.setContextMenu(menu)
# I've tried using the same parent as QSystemTrayIcon,
# but the label is not shown.
# self.aboutWindow = AboutWindow(parent=parent)
self.aboutWindow = AboutWindow(parent=None)
def createMenuActions(self, menu):
exitAction = QtGui.QAction("Exit", menu)
configureAppAction = QtGui.QAction("Configure Application", menu)
aboutAction = QtGui.QAction("About", menu)
self.connect(configureAppAction, QtCore.SIGNAL('triggered()'), self._configureApp)
self.connect(aboutAction, QtCore.SIGNAL('triggered()'), self._showAbout)
self.connect(exitAction, QtCore.SIGNAL('triggered()'), self._exitApp)
self.addActionsToMenu(menu, configureAppAction, aboutAction, exitAction)
def addActionsToMenu(self, menu, *args):
for action in args:
menu.addAction(action)
def _configureApp(self): pass
def _showAbout(self):
self.aboutWindow.show()
def _exitApp(self):
sys.exit(0)
def main():
app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
# I'm passing a widget parent to QSystemTrayIcon as pointed out in:
# http://stackoverflow.com/questions/893984/pyqt-show-menu-in-a-system-tray-application
trayIcon = SystemTrayIcon(QtGui.QIcon("icon.xpm"), widget)
trayIcon.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
正如代码中指出的那样,我尝试为托盘图标和AboutWindow对象设置相同的父级,但这不起作用(标签未显示)。我也试过继承QMainWindow,但是同样的效果发生了。
我想了解,当窗口和图标共享同一个父级时,如果从QSystemTrayIcon打开一个新窗口时,这是默认行为,并且是否有针对此问题的解决方法。
感谢。
答案 0 :(得分:0)
好吧,我想我对这个问题不太清楚,但我找到了一个简单的解决方案。
Qt有一个方法可以捕获调度到窗口小部件的关闭事件(http://doc.qt.nokia.com/4.6/qwidget.html#closeEvent)。您可以在QWidget子类中重写此方法以防止窗口小部件关闭(在我的所有测试中,它将关闭整个应用程序)并仅隐藏它。下面的代码显示了我在代码中更改的内容以使其正常工作:
...
class AboutWindow(QtGui.QLabel):
def __init__(self, parent=None):
QtGui.QLabel.__init__(self, parent=parent)
self.setText("""
Huge text goes here
""")
# Prevent the widget from closing the whole application, only hides it
def closeEvent(self, event):
event.ignore()
self.hide()
...
答案 1 :(得分:0)
出现此问题是因为当您关闭“仅”窗口时,Qt错误地认为您要退出该应用程序。 你的(Kaos12)答案是一个丑陋的修复imho,有时你真的想要关闭这些东西(这与隐藏它不一样)。 正确的方法是通过添加以下行来禁用此行为:
app.setQuitOnLastWindowClosed(False)
在该代码中的第50行之后(在'创建'应用程序之后)。即使所有窗口都关闭,该指令也会告诉Qt不要退出应用程序。