Я проверяю пример Qt Spin Box Delegate. В примере
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.
Спасибо
В этом случае право собственности на объект редактора передается вызывающей стороне createEditor (). Это обычно QAbstractItemView экземпляр (ы) с использованием делегата для рисования. Всякий раз, когда им нужен редактор (например, из-за того, что пользователь нажал на ячейку), они вызывают createEditor () для делегата, помещают его и показывают его. После этого экземпляры редактора управляются изнутри в QAbstractItemView и удаляются, когда они больше не используются или когда удаляется сам QAbstractItemView. Можно даже настроить удаление (или предотвратить его), переопределив QAbstractItemDelegate :: destroyEditor (). Это обычно не обязательно, хотя.
Этот конкретный случай очень специфичен, однако, это не общий механизм Qt, такой как отношения родитель / потомок на работе, а «ручной» код в реализации QAbstractItemView. Поиск qtbase / src / widgets / itemviews для «releaseEditor», если вы хотите увидеть детали.
Часто (но, к сожалению, не всегда) документация Qt упоминает владельца. Например. за QAbstractItemView :: setModel (), документация гласит:
Представление не становится владельцем модели, если только оно не является родительским объектом модели, поскольку модель может совместно использоваться многими различными представлениями.
Для QItemDelegate :: createEditor () ничего не упоминается. В нем должно быть что-то вроде «Владение созданным виджетом редактора передается вызывающей стороне», но также следует упомянуть destroyEditor ().
QSpinBox
это подкласс QObject
и он использует иерархию родителей и детей всех QObject
s (обратите внимание, как вы назначаете редактора родителем при его создании). Увидеть документы для деталей. Редактор будет удален прямо перед QWidget
прошло как parent
будут. Он вообще не зависит от виртуальных деструкторов, так что не волнуйтесь. Он использует мета-свойства (список детей) для выполнения удаления. Кроме того QObject
деструктор ЯВЛЯЕТСЯ виртуальный, так что любой его подкласс автоматически имеет виртуальный деструктор.
Глядя на делегат док действительно, как указал Фрэнк Остерфельд, делегат удаляет делегата вручную destroyEditor
метод, когда он больше не нужен (например, закрыт пользователем).