Pergunta

Estou subclasse QAbstractItemDelegate. Este é meu código. Sugestões são bem-vindos:

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 este é executado, eu só ver que editorEvent é chamado duas vezes para cada evento de edição - não createEditor

Foi útil?

Solução

De documentação AbstractItemDelegate do Qt:

Para fornecer edição costume, há duas abordagens que podem ser usadas. A primeira abordagem é criar um widget de editor e exibi-lo diretamente em cima do item. Para fazer isso você deve reimplementar createEditor () para fornecer um widget de editor, setEditorData () para preencher o editor com os dados do modelo e setModelData () para que o delegado pode atualizar o modelo com dados do editor.

A segunda abordagem é a de lidar com eventos do usuário diretamente pelo reimplementar editorEvent ().

Isto parece dizer que você está faltando alguma coisa para provocar a primeira abordagem. Meu palpite é que a função data() do seu modelo não está retornando o valor correto para a opção Qt::EditRole.

Outras dicas

Eu tinha implementado um TableView que eu tinha inhertied de QItemDelegate. Então eu tive problema semelhante. Eu segui-lo para baixo para não chamar 'voltar QItemDelegate :: editorEvent (evento, modelo, opção, index);' no método editorEvent (...).

Você pode tentar isso. Talvez isso ajuda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top