Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt:应用程序意外地离开主循环_Python_Qt_Pyqt_Pyqt4 - Fatal编程技术网

Python PyQt:应用程序意外地离开主循环

Python PyQt:应用程序意外地离开主循环,python,qt,pyqt,pyqt4,Python,Qt,Pyqt,Pyqt4,我有一个简单的PyQt应用程序,它有一个任务栏图标,可以通过单击关闭按钮或任务栏图标从任务栏中隐藏。应用程序可以从托盘图标上下文菜单关闭。用户单击上下文菜单中的“退出”后,出现带有确认问题的模式窗口。如果用户单击“是”,应用程序将关闭,如果“否”,应用程序将继续工作 当主窗口被隐藏时,应用程序将被关闭,即使用户在模式窗口中单击“否”,但当窗口未被隐藏时,一切正常。这也会发生在任何模式窗口中,例如一些信息。我想QtGui.QMessageBox.question的父paarmeter中有一些“魔力

我有一个简单的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()

默认情况下,Qt应用程序在最后一个窗口关闭时终止。我不知道为什么在调用上下文菜单后它会关闭。我想是因为你把窗户藏得很奇怪。通常可以使用
hide()
隐藏窗口

可以轻松禁用此行为:

app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)

默认情况下,Qt应用程序在最后一个窗口关闭时终止。我不知道为什么在调用上下文菜单后它会关闭。我想是因为你把窗户藏得很奇怪。通常可以使用
hide()
隐藏窗口

可以轻松禁用此行为:

app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)

即使我做了
hide()
,它也会在我的应用程序中发生。当主窗口被隐藏并且
QMessageBox
被解除时,应用程序会自动关闭,甚至忽略隐藏窗口的
closeEvent
。即使我执行
hide()
,这种情况也会在我的应用程序中发生。当主窗口被隐藏并且
QMessageBox
被关闭时,应用程序会自动关闭,甚至忽略隐藏窗口的
closeEvent