gpt4 book ai didi

python - 何时在 PySide 中设置父级

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:37 24 4
gpt4 key购买 nike

我似乎无法在网上的任何地方找到关于这个问题的太多指导。我一直在学习 PySide,并注意到那里的一半示例只是将 QStuff 的 parent 设置为 None,而其他示例会将其设置为一个对象。我意识到可能存在垃圾收集问题。假设我有一个 QWidget 对象,我创建并引用了一个 QThing,其 parent 设置为 QWidget,然后我将 QThing .add 添加到 QWidget。看来我应该在某处进行循环引用。 Python 会进行引用计数,因此这意味着对象不会被垃圾回收。甚至像

self.addWidget(QLabel('label', self))

会导致循环引用(虽然我想这种情况是由 PySide 处理的。)也许我担心太多,所有这些都已处理,我不知道。

简而言之:在 PySide 中使用父级的正确方法是什么?

最佳答案

这里有两件事:

Qt

Qt 通过parent 关系在对象树中组织它的对象。当你处理一个对象时,所有的 child 也被销毁(在 C 端)。样式等属性也是通过这种关系继承的。事实证明,这对于 GUI 对象非常有用,毕竟当您关闭对话框时,您可能还想摆脱对话框中的按钮。

另见 Object Trees & Ownership

Python (CPython)

Python 会在对象超出范围时自动删除它们。例如,您认为已经消失的按钮,因为 Python 垃圾已经收集了它们。事实证明,在任何地方正确设置父级都有帮助。例如对于布局,最简单的方法是在布局的构造中直接指定父级(保存对 setLayout 的调用)。

但是如果你仍然有一个按钮的 python 引用,但是这个小部件被 Qt 破坏了你可能会得到一个“RuntimeError:内部 C++ 对象已经删除。”。

因此,足够大的父级设置对使用 Qt 和 Python 编写无错误代码有很大帮助。

在你的例子中:

self.addWidget(QLabel('label', self))

parent先后设置了两次。首先是在创建内部部分 QLabel('label', self) 时,其次是在调用 addWidget 时(参见 QLayout 的文档)。与其做同样的事情两次,为什么不只做一次呢?

self.addWidget(QLabel('label'))

对于循环引用本身,请参见 Should I worry about circular references in Python?

关于python - 何时在 PySide 中设置父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25877062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com