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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top