我有以下代码:
import sys
from PySide import QtGui
from PySide import QtCore
class Main_Window(QtGui.QMainWindow):
def __init__(self):
super(Main_Window,self).__init__()
self.initUI()
def initUI(self):
self.navigateur=QtGui.QMdiArea()
self.setCentralWidget(self.navigateur)
self.setGeometry(50, 50, 600, 600)
self.window =QtGui.QWidget(None,QtCore.Qt.WA_DeleteOnClose)
self.window.grid=QtGui.QGridLayout()
self.window.button=QtGui.QPushButton("quit",parent=self.window)
self.window.button.setObjectName("test")
self.window.button.clicked.connect(self.try_close)
self.window.grid.addWidget(self.window.button)
self.window.setLayout(self.window.grid)
self.window.setFixedSize(self.window.sizeHint())
self.fwindow=self.navigateur.addSubWindow(self.window,QtCore.Qt.WA_DeleteOnClose)
self.show()
def try_close(self):
self.fwindow.close()
print(self.window.findChild(QtGui.QPushButton,"test"))
def main():
app=QtGui.QApplication(sys.argv)
main_wdw=Main_Window()
sys.exit(app.exec_())
if __name__=="__main__":
main()
根据文档,当我关闭self.window时,应该删除self.window的所有子节点,但是因为print函数打印类似于PySide.QtGui.QPushButton对象的东西所以它似乎不是这样的。
出了什么问题?
答案 0 :(得分:3)
在Qt中,QObject
不会立即删除(请参阅QObject::deleteLater()方法)。在Python中,垃圾收集器会删除该对象。
因此,您的小部件可能会在删除前的一段时间内停留在内存中。
答案 1 :(得分:2)
try_close
方法不是一个好的测试,因为它不允许在检查子对象之前处理必要的事件。
如果为检查添加了单独的方法,例如:
def initUI(self):
...
menu = self.menuBar().addMenu('File')
menu.addAction('Test', self.test)
def test(self):
for w in QtGui.qApp.allWidgets():
print(w.objectName(), w)
一旦处理了关闭/删除事件,您将看到具有objectName“test”的小部件及其QPushButton子节点被删除。