Загадка: почему в Qt вызывается editorEvent, но не createEditor - PullRequest
2 голосов
/ 06 мая 2009

Я создаю подкласс QAbstractItemDelegate. Это мой код Предложения приветствуются:

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

Когда это выполняется, я вижу только то, что editorEvent вызывается дважды для каждого события редактирования - без createEditor!

Ответы [ 2 ]

7 голосов
/ 06 мая 2009

Из документации Qt AbstractItemDelegate:

Для обеспечения пользовательского редактирования можно использовать два подхода. Первый подход заключается в создании виджета-редактора и отображении его непосредственно над элементом. Для этого вы должны переопределить createEditor () для предоставления виджета редактора, setEditorData () для заполнения редактора данными из модели и setModelData (), чтобы делегат мог обновить модель данными из редактора.

Второй подход заключается в непосредственной обработке пользовательских событий путем повторной реализации editorEvent ().

Это говорит о том, что вы что-то упустили, чтобы вызвать первый подход. Я предполагаю, что функция data() вашей модели не возвращает правильное значение для опции Qt::EditRole.

0 голосов
/ 06 мая 2009

Я реализовал TableView, который я унаследовал от QItemDelegate. Тогда у меня была похожая проблема. Я проследил, чтобы он не вызывал return QItemDelegate :: editorEvent (событие, модель, опция, индекс); в методе editorEvent (...).

Вы можете попробовать это. Может быть, это поможет.

...