PySide:在父对象关闭时未破坏子对象

时间:2013-12-20 14:29:11

标签: python qt pyside

我有以下代码:

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对象的东西所以它似乎不是这样的。

出了什么问题?

2 个答案:

答案 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子节点被删除。