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.