Question

Je sous-classe QAbstractItemDelegate. Ceci est mon code. Les suggestions sont les bienvenues:

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

Lorsque ceci est exécuté, je ne vois que editorEvent est appelé deux fois pour chaque événement d'édition - pas de createEditor!

Était-ce utile?

La solution

De la documentation AbstractItemDelegate de Qt:

  

Pour fournir un montage personnalisé, deux approches peuvent être utilisées. La première approche consiste à créer un widget éditeur et à l'afficher directement au-dessus de l'élément. Pour ce faire, vous devez réimplémenter createEditor () afin de fournir un widget d'éditeur, setEditorData () pour renseigner l'éditeur avec les données du modèle et setModelData () afin que le délégué puisse mettre à jour le modèle avec les données de l'éditeur.

     

La deuxième approche consiste à gérer les événements utilisateur directement en réimplémentant editorEvent ().

Cela semble indiquer qu'il vous manque quelque chose pour déclencher la première approche. À mon avis, la fonction data () de votre modèle ne renvoie pas la valeur appropriée pour l'option Qt :: EditRole .

Autres conseils

J'avais implémenté un TableView que j'avais hérité de QItemDelegate. Ensuite, j'ai eu le même problème. Je l'ai suivi pour ne pas appeler 'return QItemDelegate :: editorEvent (événement, modèle, option, index);' dans la méthode editorEvent (...).

Vous pouvez essayer ceci. Peut-être que ça aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top