Python 在 Qt 中实例化没有引用的对象

Instantiating object without a reference in Qt for Python

我刚刚阅读了 an article 关于内存管理的内容,其中指出在 Python 中使用 Qt 时,“必须保存对所有已创建对象的引用,即使您不打算使用它们”。

虽然在这个例子中后果可以忽略不计,但这是否意味着实例化例如以下时尚标签是不好的做法?

import sys
from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        vb_main = QVBoxLayout()
        vb_main.addWidget(QLabel('Foo'))
        vb_main.addWidget(QLabel('Bar'))
        vb_main.addStretch()
        self.setLayout(vb_main)


def main():
    app = QApplication([])
    window = MainWindow()
    window.show()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

不,这不是一个坏习惯。文章中提供的示例与您提供的示例不同。

在 Qt 的 python 绑定中,有 2 个处理内存的标准:

  • Python:是python对引用的通常处理方式,即只要一个对象在一个范围内被引用,那么该对象就不会被引用淘汰了。

  • Qt:出于设计原因,某些对象(它们的内存)由其他对象处理,当发生这种情况时,Qt 在文档中明确指出。这种情况的一个例子是 QObject 的层次结构树,其中 QObject 的子对象将具有与其父对象相同的生命周期,并且由于 QWidgets 是 QObject,因此它们将保持该特征。

因此,如果至少满足其中一项条件,则不会删除该对象。


翻译成 PySide6 的原始示例:

from PySide6.QtWidgets import QApplication, QLabel


def createLabel():
    label = QLabel("Hello, world!")
    label.show()


app = QApplication([])
createLabel()

app.exec()

在原始示例中,none 已实现,因为作为 python 变量的 QLabel 只有有限的范围并且没有 QObject 作为父级。

另一方面,在您的示例中,第二个条件得到满足,因为当将它添加到 QLayout 时,后者将使父级成为它所在的 QWidget。