Mystery: In Qt, warum sollte editorEvent genannt werden, aber nicht createEditor?
-
06-07-2019 - |
Frage
Ich bin Subklassen QAbstractItemDelegate. Dies ist mein Code. Vorschläge sind willkommen:
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;
}
Wenn diese ausgeführt wird, ich nur sehen, dass editorEvent zweimal für jedes Bearbeitungsereignis aufgerufen wird - ohne createEditor
Lösung
Von Qt AbstractItemDelegate
Dokumentation:
individuelle Bearbeitung bereitzustellen, gibt es zwei Ansätze, die verwendet werden können. Der erste Ansatz ist ein Editor-Widget zu erstellen und es direkt auf dem Element angezeigt werden soll. Um dies zu tun, müssen Sie createEditor () neu implementieren einen Editor-Widget zur Verfügung zu stellen, setEditorData (), um den Editor mit den Daten aus dem Modell zu füllen, und setModelData (), so dass der Delegat kann das Modell mit Daten aus dem Editor aktualisieren.
Der zweite Ansatz ist durch die Neuimplementierung editorEvent () Benutzerereignisse direkt zu handhaben.
Dies scheint zu sagen, dass Sie etwas vermissen den ersten Ansatz auszulösen. Meine Vermutung ist, dass Ihr Modell der data()
Funktion nicht, um den richtigen Wert für die Qt::EditRole
Option zurück.
Andere Tipps
hatte ich eine Tableview implementiert, die ich von QItemDelegate inhertied hatte. Dann hatte ich ähnliches Problem. Ich verfolgt es auf nicht Aufruf 'zurückzukehren QItemDelegate :: editorEvent (Ereignis, Modell, Option, Index);' im editorEvent (...) Methode.
Sie können dies versuchen. Vielleicht hilft es.