有没有办法在PyQt应用程序结束前调用一个函数?

7 投票
4 回答
13403 浏览
提问于 2025-04-16 04:48

我正在收集我应用程序的使用统计数据,其中包括每次会话持续的时间。不过,我似乎无法保存这些信息,因为我尝试的信号都没有成功调用我的 report_session 函数。

我已经尝试过的信号有:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. destroyed()

要么这些信号根本没有被触发,要么应用程序在那之后活得不够久,无法运行其他任何东西。以下是我的主程序:

app = QtGui.QApplication(sys.argv)

ui = MainWindow()
ui.app = app
QtCore.QObject.connect(ui, QtCore.SIGNAL("destroyed()"),  ui.report_session)
ui.show()
logger.info('Started!')
splash.finish(ui)

sys.exit(app.exec_())

4 个回答

5

把代码放在 app.exec_sys.exit 之间:

ret = app.exec_()
# Your code that must run when the application closes goes here
sys.exit(ret)
8

Mark Byers 提到的方法会在主窗口关闭后运行,这时候窗口里的控件就不能用了。

如果你需要使用窗口上控件的值,最好在窗口关闭的事件中处理这些事情:

class MainWidget(QtGui.QWidget):

    #...

    def closeEvent(self, event):
        print "closing PyQtTest"
        self.SaveSettings()
        # report_session()

另外,可以看看 ZetCode 教程中的消息框示例,链接在这里 PyQt4 工具包中的第一个程序(在页面的末尾)。这个示例展示了如何接受或取消关闭请求。

1

我找到了一份这个答案,里面讲的是如何重写closeEvent()这个方法。

对我来说,这个方法效果很好。

撰写回答