如何从QAbstractItemView中删除小部件

How to remove widget from QAbstractItemView

本文关键字:删除 小部 QAbstractItemView      更新时间:2023-10-16

QAbstractItemView有' setIndexWidget,但没有' remove '功能。

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

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

如何删除小部件?

我使用PyQt,但我认为这是C++PySide的有效问题。

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

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

如果您传递None作为新的小部件,它将删除旧的小部件,而不放置任何东西,有效地删除旧的小部件:

foo.setIndexWidget(index, None)

注意:这类似于将None传递为parent,没有removeParent,只有setParent

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

这对我来说不是很直观,因为我把小部件设置为QAbstractView而不是ItemModel

更准确地说,API文档建议使用beginResetModel()endResetModel(),而不是我遵循的reset()