Domanda

Sto eseguendo la sottoclasse di QAbstractItemDelegate. Questo è il mio codice Suggerimenti sono benvenuti:

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;
}

Quando viene eseguito, vedo solo che editorEvent viene chiamato due volte per ogni evento di modifica - no createEditor!

È stato utile?

Soluzione

Dalla documentazione AbstractItemDelegate di Qt:

  

Per fornire modifiche personalizzate, ci sono due approcci che possono essere usati. Il primo approccio è quello di creare un widget dell'editor e visualizzarlo direttamente in cima all'elemento. Per fare ciò è necessario reimplementare createEditor () per fornire un widget dell'editor, setEditorData () per popolare l'editor con i dati del modello e setModelData () in modo che il delegato possa aggiornare il modello con i dati dell'editor.

     

Il secondo approccio è gestire gli eventi utente direttamente reimplementando editorEvent ().

Questo sembra dire che ti manca qualcosa per innescare il primo approccio. Suppongo che la funzione data () del tuo modello non stia restituendo il valore corretto per l'opzione Qt :: EditRole .

Altri suggerimenti

Avevo implementato un TableView che avevo ereditato da QItemDelegate. Quindi ho avuto un problema simile. L'ho rintracciato per non chiamare 'return QItemDelegate :: editorEvent (evento, modello, opzione, indice);' nel metodo editorEvent (...).

Puoi provare questo. Forse aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top