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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值