gpt4 book ai didi

pyqt - 在pyqt中清理小部件的正确方法

转载 作者:行者123 更新时间:2023-12-04 10:01:09 25 4
gpt4 key购买 nike

使用 PyQt4 时清理/删除小部件的“正确”或惯用方法是什么?

考虑以下代码:

choices = ['a', 'b', 'c']
checkboxes = []
layout = QtGui.QVBoxLayout()

dialog = MyDialog()

for c in choices:
checkboxes.append(QtGui.QCheckBox(c)
layout.addWidget(chkbox)

dialog.setLayout(layout)

for c in checkboxes:
c.setParent(None)
c.deleteLater()
c = None

以上代码使用 setParent() , deleteLater() ,并将对象设置为 None .所有这些都是必要的吗?

另一种可能的情况是我有一个对话框,上面有一堆小部件,想要删除这些小部件并添加新的小部件。我不想“泄露”旧的小部件,但我不确定做这样的事情的正确方法是什么。

在我看来 deleteLater()可能永远不需要。它只是减少引用计数吗?如果是这样,不只是将变量设置为 None 会做同样的事情吗?

最佳答案

您应该记住做的第一件事是为您的小部件使用父/子关系。当您这样做时,它们将归 Qt 所有,并会在删除父项时自动清理所有子项。

dialog = MyDialog()

for c in choices:
checkboxes.append(QtGui.QCheckBox(c, parent=dialog))
layout.addWidget(chkbox)

在这种情况下,当您删除对话框时,所有复选框都将被正确清除。这处理了您问题的一部分。我意识到当您将它们添加到布局时,您隐式设置了父级。但是您不应该在删除之前清除该父级。它 允许自动删除子级的父级关系。不是引用计数。引用方面将是 python 端的事情,当没有更多引用时,它将被垃圾收集。
deleteLater非常重要,当您希望在控制返回到 eventloop 时发生删除时使用。当您从布局中删除小部件并添加新小部件时,这也是删除小部件的安全方法:
# clear a layout and delete all widgets
# aLayout is some QLayout for instance
while aLayout.count():
item = aLayout.takeAt(0)
item.widget().deleteLater()

一旦此方法完成,这些小部件实际上将被删除。 deleteLater对于删除当前正在发生插槽或事件的小部件也很有用。比如一个 QPushButton 可以在点击时删除自己。

也不需要设置 c = None .一旦父对象被删除,并触发其所有子对象的删除,递归地,您对该对象的 Python 引用将无效。所以你需要做的就是不再使用它们。如果它们在列表中,请清除列表。访问它们会引发 RuntimeError: wrapped C/C++ object of %S has been deleted意味着它们被删除。

关于pyqt - 在pyqt中清理小部件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13827798/

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