Pregunta

Estoy subclasificando QAbstractItemDelegate. Este es mi codigo. Las sugerencias son bienvenidas:

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

Cuando esto se ejecuta, solo veo que editorEvent es llamado dos veces por cada evento de edición, ¡no createEditor!

¿Fue útil?

Solución

De la documentación AbstractItemDelegate de Qt:

  

Para proporcionar una edición personalizada, hay dos enfoques que se pueden usar. El primer enfoque es crear un widget de editor y mostrarlo directamente encima del elemento. Para hacer esto, debe volver a implementar createEditor () para proporcionar un widget de editor, setEditorData () para llenar el editor con los datos del modelo y setModelData () para que el delegado pueda actualizar el modelo con datos del editor.

     

El segundo enfoque es manejar los eventos del usuario directamente reimplementando editorEvent ().

Esto parece decir que te falta algo para activar el primer enfoque. Supongo que la función data () de su modelo no devuelve el valor adecuado para la opción Qt :: EditRole .

Otros consejos

Había implementado un TableView que había heredado de QItemDelegate. Entonces tuve un problema similar. Lo rastreé hasta no llamar 'return QItemDelegate :: editorEvent (event, model, option, index);' en el método editorEvent (...).

Puedes probar esto. Quizás ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top