我有一个简单的PyQt应用程序,它有一个托盘图标,可以通过单击关闭按钮或托盘图标隐藏在任务栏中。可以从托盘图标上下文菜单关闭应用程序。用户在上下文菜单中单击“退出”后,将出现带有确认问题的模态窗口。如果用户点击“是”应用程序关闭,如果“否”应用程序继续工作。
当主窗口被隐藏时,应用程序将被关闭,即使用户在模态窗口中单击“否”,但是当窗口未被隐藏时,一切都正确。这也适用于任何模态窗口,例如某些信息。我认为QtGui.QMessageBox.question的父级paarmeter中有一些“魔力”,但我不知道如何处理它。请帮助解决这个烦人的错误。
以下是代码:
import sys
from datetime import datetime
from PyQt4 import QtGui, QtCore
class SampleWindow(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.init_ui()
self.tray_icon.activated.connect(self.tray_click)
self.show_window.triggered.connect(self.show_from_tray)
self.now_button.triggered.connect(self.info)
self.appexit.triggered.connect(self.app_close)
def init_ui(self):
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Message box')
self.tray_icon = QtGui.QSystemTrayIcon()
self.tray_icon.setIcon(QtGui.QIcon('clock.ico'))
self.tray_icon.show()
self.iconMenu = QtGui.QMenu()
self.show_window = self.iconMenu.addAction("MyApp")
self.show_window.setDisabled(True)
self.iconMenu.addSeparator()
self.now_button = self.iconMenu.addAction("Now")
self.appexit = self.iconMenu.addAction("Exit")
self.tray_icon.setContextMenu(self.iconMenu)
def info(self):
now = str(datetime.now())
QtGui.QMessageBox.information(self, 'Now', now)
def app_close(self):
info_msg = "Are you sure to quit?"
reply = QtGui.QMessageBox.question(self,
'Exit',
info_msg,
QtGui.QMessageBox.Yes,
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
QtGui.QApplication.quit()
def closeEvent(self, event):
self.hide_to_tray()
event.ignore()
def show_from_tray(self):
self.setWindowFlags(QtCore.Qt.Window)
self.showNormal()
self.activateWindow()
self.show_window.setDisabled(True)
def hide_to_tray(self):
self.setWindowFlags(QtCore.Qt.Tool)
self.show_window.setDisabled(False)
def tray_click(self, reason):
if reason != QtGui.QSystemTrayIcon.Context:
if self.isHidden():
self.show_from_tray()
else:
self.hide_to_tray()
def main():
app = QtGui.QApplication(sys.argv)
sample = SampleWindow()
sample.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
答案 0 :(得分:4)
默认情况下,Qt应用程序在最后一个窗口关闭时终止。我不确定调用上下文菜单后它为什么会关闭。我想是因为你以一种奇怪的方式隐藏你的窗户。通常可以使用hide()
隐藏窗口。
可以轻松禁用此行为:
app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)