如何从 closeEvent 处理使用 PyQt4 检测注销/关闭?

Posted

技术标签:

【中文标题】如何从 closeEvent 处理使用 PyQt4 检测注销/关闭?【英文标题】:How do I handle detect logout/shutdown with PyQt4 from a closeEvent? 【发布时间】:2014-02-27 15:05:05 【问题描述】:

我想在用户注销或关闭我的应用程序时进行处理,但我遇到了麻烦,因为当 MainWindow 关闭时我的应用程序最小化到托盘。当我注销时, closeEvent 被调用,但我不知道它是来自试图退出的操作系统还是按下“x”(关闭)按钮的用户。

只有当它是操作系统时,我才会想要关闭我的连接并实际终止应用程序。不幸的是,closeEvent 在任何其他函数之前被调用。在下面的示例中,只有注释掉 event.ignore() 才会调用 commitDataaboutToQuit

任何帮助将不胜感激:)

http://pyqt.sourceforge.net/Docs/PyQt4/qapplication.html#commitData

http://pyqt.sourceforge.net/Docs/PyQt4/qcoreapplication.html#aboutToQuit

http://qt-project.org/doc/qt-4.8/qapplication.html#details

import sys
from PyQt4 import QtGui


class myWidget(QtGui.QWidget):
    def closeEvent(self, event):
        print "CLOSING"
        event.ignore()


class myApp(QtGui.QApplication):
    def __init__(self, argv):
        QtGui.QApplication.__init__(self, argv)
        print "CREATED"

    def commitData(self, session_manager):
        print "COMMITTING"


def cd(session_manager):
    print "ALSO CMOMMITTING"


def about_to_quit():
    print "QUITTING"


def main():
    app = myApp(sys.argv)
    app.aboutToQuit.connect(about_to_quit)
    w = myWidget()
    w.resize(250, 150)
    w.setWindowTitle('Simple')
    w.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

好吧,我想我当时至少浪费了 5 个小时。我在windows中试过了,效果很好。然后我又做了一些网络搜索,发现了这些错误:

https://bugreports.qt-project.org/browse/QTBUG-10280 (Qt4)

https://bugreports.qt-project.org/browse/QTBUG-33034 (Qt5)

documentation 表示它可以在 OSX 中运行!!

所以 ATM 不可能通过“x”(关闭)按钮在后台运行应用程序,并且在 osx 中干净地处理注销。

【讨论】:

以上是关于如何从 closeEvent 处理使用 PyQt4 检测注销/关闭?的主要内容,如果未能解决你的问题,请参考以下文章

Python PyQt4 关闭应用程序

PyQt5 closeEvent 方法

处理 closeEvent 接受/忽略

如何覆盖 closeEvent 函数以使其正常工作

PyQt4:如何/何时从 QTabWidget 的子类发出自定义信号?

pyqt4 和 pyserial