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。
我刚刚阅读了 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。