3

QAbstractItemView 有`setIndexWidget但没有“删除”功能。

当我想从视图中删除它们时,我试图通过存储传递给QAbstractItemViewhide/delete它们的小部件来解决它,这最终导致RuntimeError: wrapped C/C++ object of %S has been deleted错误。我认为这是由于小部件的所有权被传递给视口,正如文档所说:

Sets the given widget on the item at the given index, passing the ownership of the widget to the viewport.

如何删除小部件?

我正在使用PyQt,但我认为这也是一个有效的C++问题PySide

4

3 回答 3

1

QAbstractItemView基于模型的视图的基础。这意味着您应该从模型中删除项目,而不是从视图中。然后模型负责通过适当的信号通知视图。

您可能对QAbstractItemModel方法感兴趣,例如removeRow. 如果您自己实现模型,则您有责任自己实现它们并发出信号。

于 2013-02-28T09:52:20.633 回答
1

如果您None作为新小部件传递,它将删除旧小部件并且什么都不放,从而有效地删除旧小部件:

foo.setIndexWidget(index, None)

注意:这类似于传递Noneas parent,没有removeParent但只有setParent.

于 2013-02-28T10:00:49.020 回答
0

找到了适合我的解决方法。使用QAbstractItemModel::reset()似乎也删除了由 setIndexWidget() 设置的小部件。

这对我来说不是很直观,因为我将小部件设置为QAbstractViewnot ItemModel

更准确地说,API doc 建议使用beginResetModel()andendResetModel()而不是reset()我遵循的。

于 2013-02-28T09:43:39.003 回答