QAbstractItemView有`setIndexWidget但没有“删除”功能。
当我想要从视图中删除它们时,我尝试通过存储传递给QAbstractItemView
和hide
/ 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.
,但我认为这也是PyQt
和C++
的有效问题。
答案 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
。