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

fcc*_*lho 6 python user-interface pyqt signals-slots pyqt4

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

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

  1. lastWindowClosed()
  2. aboutToQuit()
  3. 销毁()

这些信号永远不会被释放,或者应用程序在此之后不能长时间运行以运行任何其他信号.这是我的主要内容:

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_())
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

把代码之间app.exec_sys.exit

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


Ale*_*lli 5

为了确保在进程终止时调用 Python 函数,通常(无论是否涉及 Qt;-),您可以使用标准 Python 库的atexit模块:

import atexit

def whatever(): ...

atexit.register(whatever)
Run Code Online (Sandbox Code Playgroud)

出于谨慎考虑,我建议不要为此目的使用绑定方法而不是函数——它“应该”工作,但进程的销毁阶段总是有些微妙,并且越简单越好。

atexit当然,不会触发进程的足够严重的崩溃(例如,如果进程被 杀死kill -9,那么根据定义,它不会有机会运行任何终止代码)——操作系统会看到这一点;- )。如果您需要处理任何崩溃,无论您必须从一个单独的“看门狗”过程中处理多么困难,这是一个非常微妙的问题。


Tod*_*odd 5

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

如果需要使用表单上控件中的任何值,则需要捕获close事件并在此处进行工作:

class MainWidget(QtGui.QWidget):

    #...

    def closeEvent(self, event):
        print "closing PyQtTest"
        self.SaveSettings()
        # report_session()
Run Code Online (Sandbox Code Playgroud)

另外,请参见ZetCode教程PyQt4工具箱中的“第一个程序”中的“消息框”示例(在页面末尾)。这显示了如何接受或取消关闭请求。


fcc*_*lho 1

找到了这个涉及重载 closeEvent() 的答案。

它对我来说非常有效。