2013-02-28 74 views
1

QAbstractItemView有`setIndexWidget但沒有「刪除」功能。如何從QAbstractItemView中刪除小部件

我試圖通過存儲傳遞給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的有效問題。

回答

0

找到了適合我的工作安排。使用QAbstractItemModel::reset()似乎也刪除由setIndexWidget()設置的小部件。

這對我來說不是很直觀,因爲我將小部件設置爲QAbstractView而不是ItemModel

更準確地說,API文檔建議使用beginResetModel()endResetModel(),而不是我遵循的reset()

+0

'重置'有一些副作用,並不總是可取的。例如,我用'QTreeView'試了一下,它摺疊了所有擴展項AFAICR。 – Kos 2013-02-28 09:45:39

+0

@Kos就像我剛纔提到的,我使用'beginResetModel'和'endResetModel',而不是'reset'。這會改變你的結果嗎? – IsaacS 2013-03-02 05:22:50

+1

重點是模型發出什麼信號 - 視圖聽取它們並作出相應反應。信號'modelAboutToBeReset()'和'modelReset()'沒有很多信息。如果你改變(以某種方式)使模型增加'rowsAboutToBeRemoved'和'rowsRemoved',視圖可以更好地響應。 – Kos 2013-03-02 08:55:29

1

QAbstractItemView基於模型的視圖的基礎。這意味着您應該從模型中刪除項目,而不是從視圖中刪除項目。然後模型負責通過適當的信號通知視圖。

您可能對QAbstractItemModel方法感興趣,如removeRow。如果你自己實現模型,你有責任實現它們並自己提高信號。

0

如果傳遞None作爲新的小部件,它會刪除舊的,把什麼代替,有效去除舊的部件:

foo.setIndexWidget(index, None) 

注:這是類似於傳遞Noneparent有是removeParent,但只有setParent

+1

這不起作用 – 2016-01-29 17:39:13

+0

公平起見,我認爲這是正確的答案。另外,如果你想從視圖中刪除舊的小部件,你可以使用'wdg = view.indexWidget(index)',然後將小部件設置爲'view.setIndexWidget(index,None)',最後調用'wdg .setParent(None)'和'wdg.deleteLater()' – brembo 2017-12-20 15:04:59

相關問題