我正在为我的应用程序收集使用情况统计信息,其中包括每个会话的持续时间。但是,我似乎无法保存此信息,因为我尝试的信号实际上没有成功调用我的report_session函数。
这是我已经尝试过的信号:
要么这些信号永远不会被释放,要么应用程序在此之后不能长时间运行以运行其他任何信号。这是我的主要内容:
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_())
答案 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()。
它对我来说很完美。