미스터리 : QT에서는 왜 editorevent가 호출되지만 CreateEditor가 아닌가?

StackOverflow https://stackoverflow.com/questions/828819

  •  06-07-2019
  •  | 
  •  

문제

나는 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가 두 번 호출되는 것을 봅니다.

도움이 되었습니까?

해결책

QT에서 AbstractItemDelegate 선적 서류 비치:

사용자 정의 편집을 제공하기 위해 사용할 수있는 두 가지 접근 방식이 있습니다. 첫 번째 방법은 편집기 위젯을 만들고 항목 위에 직접 표시하는 것입니다. 이를 위해서는 편집기 위젯, SetedItorData ()를 제공하려면 CreateEditor ()를 재구성하여 모델의 데이터로 편집기를 채우고 SetModelData ()를 제공하여 대의원이 편집기의 데이터로 모델을 업데이트 할 수 있도록해야합니다.

두 번째 접근법은 editorevent ()를 다시 구현하여 사용자 이벤트를 직접 처리하는 것입니다.

이것은 당신이 첫 번째 접근법을 트리거하기 위해 무언가를 놓치고 있다고 말하는 것 같습니다. 내 생각에 당신의 모델이라는 것입니다 data() 함수는 적절한 값을 반환하지 않습니다 Qt::EditRole 옵션.

다른 팁

나는 Qitemdelegate에서 억제 한 TableView를 구현했습니다. 그런 다음 비슷한 문제가있었습니다. 나는 'return qitemdelegate :: editorevent (이벤트, 모델, 옵션, 인덱스)를 부르지 않도록 추적했다. editorevent (...) 방법에서.

당신은 이것을 시도 할 수 있습니다. 아마도 도움이 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top