如何从QAbstractItemView中删除小部件

时间:2013-02-28 05:40:20

标签: c++ pyqt pyside qtreeview

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

当我想要从视图中删除它们时,我尝试通过存储传递给QAbstractItemViewhide / delete小部件的小部件来解决这个问题,最后以{{ 1}}错误。我假设这是由于小部件的所有权传递给视口,正如文档所说:

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. ,但我认为这也是PyQtC++的有效问题。

3 个答案:

答案 0 :(得分:1)

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

您可能对QAbstractItemModel方法感兴趣,例如removeRow。如果您自己实施该模型,您将负责实施它们并自行提升信号。

答案 1 :(得分:0)

找到适合我的工作计划。使用QAbstractItemModel::reset()似乎也删除了由setIndexWidget()设置的小部件。

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

更准确地说,API文档建议使用beginResetModel()endResetModel()代替我跟随的reset()

答案 2 :(得分:0)

如果您将None作为新窗口小部件传递,它将删除旧窗口小部件,而不是放置任何内容,从而有效删除旧窗口小部件:

foo.setIndexWidget(index, None)

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