QAbstractItemView имеет `setIndexWidget но не имеет функции «удалить».
Я попытался обойти это, сохраняя виджеты, которые передаются QAbstractItemView
а также hide
/ 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
тоже.
QAbstractItemView
является основой для основанные на модели представления. Это означает, что вы должны удалять элементы из модели, а не из вида. Затем модель отвечает за уведомление вида с помощью соответствующих сигналов.
Вы, вероятно, заинтересованы в QAbstractItemModel
методы, такие как removeRow
, Если вы реализуете модель самостоятельно, вы несете ответственность за их реализацию и сами.
Если вы пройдете None
как новый виджет, он удалит старый и ничего не поместит, эффективно удаляя старый виджет:
foo.setIndexWidget(index, None)
Примечание: это похоже на прохождение None
как parent
и нет removeParent
но только setParent
,
Нашел рабочую сумму, которая работает для меня. С помощью QAbstractItemModel :: сброса () Кажется, что также удаляет виджеты, которые установлены setIndexWidget ().
Это не очень интуитивно для меня, так как я устанавливаю виджеты QAbstractView
не ItemModel
,
Точнее, API doc рекомендует использовать beginResetModel()
а также endResetModel()
вместо reset()
за которым я следую.