Как удалить виджет из QAbstractItemView

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 тоже.

2

Решение

QAbstractItemView является основой для основанные на модели представления. Это означает, что вы должны удалять элементы из модели, а не из вида. Затем модель отвечает за уведомление вида с помощью соответствующих сигналов.

Вы, вероятно, заинтересованы в QAbstractItemModel методы, такие как removeRow, Если вы реализуете модель самостоятельно, вы несете ответственность за их реализацию и сами.

1

Другие решения

Если вы пройдете None как новый виджет, он удалит старый и ничего не поместит, эффективно удаляя старый виджет:

foo.setIndexWidget(index, None)

Примечание: это похоже на прохождение None как parent и нет removeParent но только setParent,

0

Нашел рабочую сумму, которая работает для меня. С помощью QAbstractItemModel :: сброса () Кажется, что также удаляет виджеты, которые установлены setIndexWidget ().

Это не очень интуитивно для меня, так как я устанавливаю виджеты QAbstractView не ItemModel,

Точнее, API doc рекомендует использовать beginResetModel() а также endResetModel() вместо reset() за которым я следую.

0
По вопросам рекламы [email protected]