Mystery: Почему в Qt вызывается editorEvent, а не createEditor?
-
06-07-2019 - |
Вопрос
Я создаю подкласс QAbstractItemDelegate. Это мой код Предложения приветствуются:
QWidget *ParmDelegate::createWidget(Parm *p, const QModelIndex &index) const {
QWidget *w;
if (index.column() == 0) {
w = new QLabel(p->getName().c_str());
} else {
if (p->isSection())
return NULL;
w = p->createControl();
}
return w;
}
QWidget *ParmDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
cout << "createEditor called" << endl;
Parm *p = reinterpret_cast<Parm*>(index.internalPointer());
QWidget *retval = createWidget(p, index);
retval->setFocusPolicy(Qt::StrongFocus);
retval->setParent(parent);
return retval;
}
void ParmDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const {
QRect rect(option.rect);
editor->setGeometry(QRect(QPoint(0,0), rect.size()));
}
void ParmDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
Parm *p = reinterpret_cast<Parm*>(index.internalPointer());
scoped_ptr<QWidget> w(createWidget(p, index));
if (!w)
return;
QRect rect(option.rect);
w->setGeometry(QRect(QPoint(0,0), rect.size()));
w->render(painter, rect.topLeft());
}
QSize ParmDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
Parm *p = reinterpret_cast<Parm*>(index.internalPointer());
scoped_ptr<QWidget> w(createWidget(p, index));
if (!w)
return QSize(0,0);
return w->sizeHint();
}
bool ParmDelegate::editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index ) {
cout << "editorEvent called" << endl;
return false;
}
Когда он запускается, я вижу только то, что editorEvent вызывается дважды для каждого события редактирования - нет createEditor!
Решение
Из документации AbstractItemDelegate
Qt:
Для обеспечения пользовательского редактирования можно использовать два подхода. Первый подход заключается в создании виджета-редактора и отображении его непосредственно над элементом. Для этого вы должны переопределить createEditor (), чтобы предоставить виджет редактора, setEditorData (), чтобы заполнить редактор данными из модели, и setModelData (), чтобы делегат мог обновить модель данными из редактора. Р>
Второй подход заключается в непосредственной обработке пользовательских событий путем повторной реализации editorEvent ().
Это говорит о том, что вы что-то упустили, чтобы вызвать первый подход. Я предполагаю, что функция data ()
вашей модели не возвращает правильное значение для опции Qt :: EditRole
.
Другие советы
Я реализовал TableView, унаследованный от QItemDelegate. Тогда у меня была похожая проблема. Я проследил, чтобы он не вызывал return QItemDelegate :: editorEvent (событие, модель, опция, индекс); в методе editorEvent (...).
Вы можете попробовать это. Может быть, это поможет.