关闭 PyQt 对话框会终止父进程? (PyQt4 / Pyside) 带有示例代码

Posted

技术标签:

【中文标题】关闭 PyQt 对话框会终止父进程? (PyQt4 / Pyside) 带有示例代码【英文标题】:closing PyQt Dialog terminates parent process? (PyQt4 / Pyside) with example code 【发布时间】:2014-04-14 21:33:24 【问题描述】:

我正在处理的 QSystemTrayIcon 应用程序存在问题。

我使用 SystemTrayIcon 作为父级或祖父级创建的任何对话框在关闭时都会终止整个应用程序,即使我覆盖了“拒绝”方法也是如此。

这是一个没有图标的简化示例。当您运行它时(此处为 Windows 7),您应该在任务栏上有一个空白托盘图标应用程序。如果左键单击它,将弹出一个空对话框。单击“X”关闭对话框也将完全终止python进程。

from PySide import QtGui, QtCore   
class RestartDialog(QtGui.QDialog):
    def __init__(self, parent):
        super(RestartDialog, self).__init__()

    def reject(self):
        self.hide()

class SystemTrayIcon(QtGui.QSystemTrayIcon):

    def __init__(self, parent=None):
        QtGui.QSystemTrayIcon.__init__(self, parent)
        self.activated.connect(self.click_trap)

    def click_trap(self, value):
        ''' Left click tray function '''
        if value == self.Trigger: #left click!
            self.dialog = RestartDialog(self)
            self.dialog.show()

    def show(self):
        QtGui.QSystemTrayIcon.show(self)


if __name__ == "__main__":
    proc = QtGui.QApplication([])
    APP = SystemTrayIcon()
    APP.show()
    proc.exec_()

【问题讨论】:

【参考方案1】:

在创建 QApplication 后尝试添加:

proc.setQuitOnLastWindowClosed(False)

默认情况下是这样,所以你的事件循环将在你关闭对话框后终止。

【讨论】:

谢谢!这是我的解决方案。我认为这与 QSystemTrayIcon 在技术上不是一个“窗口”有关,所以当最后一个“窗口”——对话框——关闭时,它会终止整个事情。现在我明白了。

以上是关于关闭 PyQt 对话框会终止父进程? (PyQt4 / Pyside) 带有示例代码的主要内容,如果未能解决你的问题,请参考以下文章

Python PyQt4 关闭应用程序

PyQt4 25行的弹出式闹钟

PyQt4 中的简单输入对话框

PyQt4 信号和槽 - QToolButton

PyQt4关闭窗口

PyQt4 文件名对话框