PyQt中对象的所有权

PyQt中对象的所有权

转载文章

所有派生自 QObject 的 PyQt 类 —— 这就包括了全部的窗口部件,因为 QWidget 就是一个 QObject 的子类 —— 都有一个“父类”。这种父一子关系可用于两种互补目的。一个没有父类的窗口部件就会是顶级窗口,而一个有父类(通常会是另一个窗口部件)的窗口部件就会被包含(或者显示)到它的父类中。这一关系也就定义了所有权,不同的父类都会拥有它们的孩子。

PyQt 使用父一子拥有权模型来确保如果一个父类(例如,一个顶级窗口)被删除,那么它的所有孩子,即该窗口所包含的全部窗口部件都应当被自动删除掉。为了避免出现内存泄漏,我们应当总是确保任何 QObject,包括全部的 QWidget 都有一个父类,而只有顶级窗口是一个例外。

大多数的 PyQt QObject 子类都会在其构造函数中的最后一个参数处(可选)带一个父类对象。但对于窗口部件一般不会(也不需要)传递这个参数。这是因为,对话框中的窗口部件是用布局管理器进行布局的,而一旦出现布局,各个窗口部件就会自动重定向父类,指向它们所在的布局,因而它们会自动正确地改正自己的父类而无须我们做任何其他动作。

class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.browser = QTextBrowser()
        self.lineedit = QLineEdit("Type an expression and press Enter")
        self.lineedit.selectAll()
        layout = QVBoxLayout()
        layout.addWidget(self.browser)
        layout.addWidget(self.lineedit)
        self.setLayout(layout)
        self.lineedit.setFocus()
        self.lineedit.returnPressed.connect(self.updateUi)
        self.setWindowTitle("Calculate")


    def updateUi(self):
        try:
            text = self.lineedit.text()
            self.browser.append("{} = <b>{}</b>".format(text,
                                eval(text)))
        except:
            self.browser.append("<font color=red>{} is invalid!</font>"
                                .format(text))

在某些情况下,就必须要明确传递一个父对象 —— 例如, 在创建那些不是窗口部件的 QObject 子对象时,或者是在创建一些不进行布局的窗口部件时(比如是一些停靠窗口部件);

最后要说明的一点是,也可能会发生这样一些情况,就是 Python 变量正引用的是一个已经不再存在的 PyQt 对象。

相关内容转载自Python Qt Gui 快速编程指南
作者Mark Summerfield [英]

点我回顶部

 
 
 
 
 
 
 
Fin.

猜你喜欢

转载自blog.csdn.net/Enderman_xiaohei/article/details/109074856