Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清理pyqt中小部件的正确方法_Pyqt_Pyqt4 - Fatal编程技术网

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

清理pyqt中小部件的正确方法,pyqt,pyqt4,Pyqt,Pyqt4,使用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

使用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()
可能永远都不需要。它只是减少引用计数吗?如果是这样的话,那么将变量设置为“无”不就可以做同样的事情吗?

您应该记住的第一件事是为小部件使用父/子关系。执行此操作时,它们将归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引用将无效。所以你需要做的就是不再使用它们。如果它们在列表中,请清除列表。访问它们会引发
运行时错误:%S的包装C/C++对象已被删除
,这意味着它们已被删除。

在创建将添加到布局的所有对象时,是否需要使用
父对象
参数?我意识到这可能更明确一点,但它是必需的吗?不,不是真的。如果您直接将它们添加到布局中,那么布局将使它们成为布局所有者的孩子。参加聚会很晚,但我想我会添加这一点-虽然没有必要使用
parent
参数-这可能是一个好主意,因为它稍微限制了代码的结构,并使其他人更容易看到预期的包含层次结构是什么。@jdi您说“访问它们会引发
RuntimeError:wrapped C/C++对象
error”-我如何检查对象是否无效/已被删除?我需要一种方法来检查
c
是否已被删除,但我不知道如何删除。请参阅我的问题:@memyself-在不尝试访问方法和捕获运行时错误的情况下检查它是否已被删除的唯一方法是使用用于PyQt的sip模块或用于PySide的shiboken模块。它们将允许您查询指针是否被删除。除此之外,只需点击objectName()方法即可捕获错误。