PyQt - parent for widgets - 必要吗?
PyQt - parent for widgets - necessary?
我尝试用一些小部件创建 GUI,所有这些都没有确定 parent。
效果很好。
这样可以吗,或者有理由指定 parent?
谢谢!
一般来说,最好尽可能指定 parent,因为它可以帮助避免 object 清理出现问题。这在退出程序时最常见,因为 python garbage-collector 的固有随机性可能意味着 object 有时会以错误的顺序被删除,从而导致程序崩溃。
但是,这个发现的问题通常不会影响标准的 GUI 小部件,因为 Qt 会在将它们添加到布局后自动重新parent它们。比较有问题的 object 是 item-models、item-delegates、graphics-scenes 等,它们与视图密切相关。
理想情况下,pyqt 程序应该有一个根 window,所有其他 object 在 parent-child 层次结构中连接到它。当根为deleted/closed时,Qt也会递归删除其所有child object。这应该只留下 pyqt 包装器 objects,可以安全地留给 python garbage-collector 进行清理。
指定 parents 的一个更具建设性的好处是,它只是让 objects 更容易被彼此访问。例如,一个常见的习惯用法是通过 parent:
遍历一组按钮
for button in parent.findChildren(QAbstractButton):
print(button.text())
我尝试用一些小部件创建 GUI,所有这些都没有确定 parent。 效果很好。
这样可以吗,或者有理由指定 parent?
谢谢!
一般来说,最好尽可能指定 parent,因为它可以帮助避免 object 清理出现问题。这在退出程序时最常见,因为 python garbage-collector 的固有随机性可能意味着 object 有时会以错误的顺序被删除,从而导致程序崩溃。
但是,这个发现的问题通常不会影响标准的 GUI 小部件,因为 Qt 会在将它们添加到布局后自动重新parent它们。比较有问题的 object 是 item-models、item-delegates、graphics-scenes 等,它们与视图密切相关。
理想情况下,pyqt 程序应该有一个根 window,所有其他 object 在 parent-child 层次结构中连接到它。当根为deleted/closed时,Qt也会递归删除其所有child object。这应该只留下 pyqt 包装器 objects,可以安全地留给 python garbage-collector 进行清理。
指定 parents 的一个更具建设性的好处是,它只是让 objects 更容易被彼此访问。例如,一个常见的习惯用法是通过 parent:
遍历一组按钮 for button in parent.findChildren(QAbstractButton):
print(button.text())