2016-03-30 3 views
0

Я проверяю пример примера Qt Spin Box Delegate. В примереКак Qt управляет памятью указателя виджета, который возвращается из функции QItemDelegate :: createEditor()

QWidget *SpinBoxDelegate::createEditor(QWidget *parent, 
    const QStyleOptionViewItem &/* option */, 
    const QModelIndex &/* index */) const 
{ 
    QSpinBox *editor = new QSpinBox(parent); 
    ... 
    return editor; 
} 

Как удалить редактор указателей на более позднем этапе? Является ли удаление выполняемым деструктором QItemDelegate? Но деструктор QItemDelegate не является виртуальным. Кто-нибудь может помочь мне объяснить, как это работает?

Я не могу поставить точку останова в QtCreator. Как я понимаю, каждый раз, когда вызывается виртуальная функция createEditor(), будет выделена новая ячейка памяти, а код клиента потеряет указатель в конце функции. Документ Qt о createEditor() не объясняет. Но я думаю, что каждая ячейка в tableView будет иметь редактор, верно?

Мне действительно интересно, как Qt удаляет эти указатели QWidget.

Благодаря

ответ

3

В этом случае право собственности на объект редактора передается вызывающему элементу createEditor(). Обычно это экземпляр QAbstractItemView, используя делегат для рисования. Всякий раз, когда им нужен редактор (например, поскольку пользователь щелкал в ячейку), они вызывали createEditor() в делегате, размещали его и показывали. Впоследствии экземпляры редактора управляются внутри QAbstractItemView и удаляются, если они больше не используются, или когда сам QAbstractItemView удаляется. Можно даже настроить удаление (или предотвратить его) путем переопределения QAbstractItemDelegate::destroyEditor(). Это обычно не обязательно.

Этот конкретный случай очень специфичен, но это не общий механизм Qt, как отношения родителя/ребенка на работе, а «ручной» код в реализации QAbstractItemView. Поиск qtbase/src/widgets/itemviews для «releaseEditor», если вы хотите увидеть подробности.

Часто (к сожалению, не всегда) в документации Qt упоминается право собственности. Например. для QAbstractItemView::setModel(), документация гласит:

мнение не брать на себя ответственность модели, если это не в модели родительского объекта, так как модель может быть разделена между многими различными видами.

Для QItemDelegate :: createEditor() ничего не упоминается. Он должен сказать что-то вроде «Владение для созданного виджета редактора передается вызывающему», но также упоминает destroyEditor().

1

QSpinBox является подклассом QObject и использует иерархию родитель-дети всех QObject с (обратите внимание, как присвоить редактору родителя при его создании). См. docs. Редактор будет удален до QWidget, пройденный как parent. Он вообще не полагается на виртуальных деструкторов, поэтому не беспокойтесь. Он использует мета-свойства (список детей) для выполнения удаления. Кроме того, деструктор QObjectIS виртуальный, поэтому любой его подкласс также имеет виртуальный деструктор.

В случае отсутствия необходимости (например, закрытого пользователем), ditor действительно (как указал Фрэнк Остерфельд), удаленный вручную делегатом, используя метод destroyEditor.

 Смежные вопросы

  • Нет связанных вопросов^_^