我有两个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)
答案 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框。