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

时间:2010-09-30 16:48:46

标签: python user-interface pyqt pyqt4 signals-slots

我正在为我的应用程序收集使用情况统计信息,其中包括每个会话的持续时间。但是,我似乎无法保存此信息,因为我尝试的信号实际上没有成功调用我的report_session函数。

这是我已经尝试过的信号:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. 破坏()
  4. 要么这些信号永远不会被释放,要么应用程序在此之后不能长时间运行以运行其他任何信号。这是我的主要内容:

    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 个答案:

答案 0 :(得分:5)

Mark Byers发布的方法将在主窗口小部件关闭后运行,这意味着其控件将不再可用。

如果您需要处理表单中控件的任何值,您将需要捕获close事件并在那里工作:

class MainWidget(QtGui.QWidget):

    #...

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

另外,请参阅ZetCode教程First programs in PyQt4 toolkit中的消息框示例(靠近页面末尾)。这显示了如何接受或取消关闭请求。

答案 1 :(得分:4)

为了确保在进程终止时调用Python函数,通常(包括或不包含Qt ;-),您可以使用标准Python库的atexit模块:

import atexit

def whatever(): ...

atexit.register(whatever)

出于谨慎,我建议不要为了这个目的使用绑定方法而不是函数 - 它“应该”起作用,但是进程的破坏阶段总是有些微妙,并且你保持它更简单,更好。

当然,

atexit不会触发进程的足够严重崩溃(例如,如果进程被kill -9终止,那么按照定义它没有机会运行任何终止代码) - 操作系统看到了;-)。如果你需要处理任何崩溃,无论你必须通过一个单独的“看门狗”过程如何努力,这是一个非常微妙的问题。

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

发现this answer涉及重载closeEvent()。

它对我来说很完美。