2

我有两个 QMainWindow 子类,MyWindowMyTimerWindow。应用程序初始化并显示一个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)
4

2 回答 2

1

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

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

    self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

这也将递归地删除窗口的所有子对象。

于 2013-12-11T17:30:35.017 回答
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 框应在主窗口关闭时自动删除。

于 2013-12-11T18:06:22.800 回答