QMainWindow关闭后,QTimer仍然存在

时间:2013-12-11 10:25:58

标签: python-2.7 pyqt pyqt4 qtimer

我有两个QMainWindow子类, MyWindow MyTimerWindow 。该应用程序初始化并显示 MyWindow 实例,该实例除了初始化并显示 MyTimerWindow 实例外什么都不做。 MyTimerWindow 创建一个子对象QTimer,它每两秒触发一次 printsomething 函数。

当我通过单击标题栏中的X手动关闭 MyTimerWindow 实例时, printsomething 功能每两秒钟一次执行。根据我的理解,当我关闭其父窗口时,应该销毁QTimer实例。有人可以解释为什么QTimer会活着吗?

以下是代码:

import sys
from PyQt4 import QtCore, QtGui

class MyWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setWindowTitle("main window")
        self.centralwidget = QtGui.QWidget()
        self.setCentralWidget(self.centralwidget)
        timerwindow = MyTimerWindow(self)
        timerwindow.show()

class MyTimerWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyTimerWindow, self).__init__(parent)
        self.setWindowTitle("timer window")
        self.centralwidget = QtGui.QWidget()
        self.setCentralWidget(self.centralwidget)
        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(2000)
        self.timer.timeout.connect(self.printsomething)
        self.timer.start()
    def printsomething(self):
        print("something")

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    returnvalue = app.exec_()
    sys.exit(returnvalue)

2 个答案:

答案 0 :(得分:1)

单击标题栏中的X将向窗口发送closeEvent。如果窗口有父级,则它将隐藏,但不会被删除。

要确保在关闭时删除父级窗口,请设置WA_DeleteOnClose标志:

    self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

这也会以递归方式删除窗口的所有子对象。

答案 1 :(得分:0)

您始终可以覆盖关闭事件。

class MyWindow(QtGui.QMainWindow):
    def __init__(self, parent=None)
        super().__init__(parent)
        ...
        self.timerWindow = MyTimerWindow(self)

    def closeEvent(self, event):
        self.timerWindow.close()
        super().__init__(parent)

或者你总是可以让你的计时器窗口成为一个对话框,这可能是最好的解决方案。我相信TimerWindow不会自动关闭,因为它是QMainWindow。主窗口关闭时应自动删除QDialog框。