2009-05-06 3 views
2

QAbstractItemDelegate를 서브 클래 싱합니다. 이것은 내 코드입니다. 제안은 환영하지 :수수께끼 : Qt에서 editorEvent가 호출되지만 createEditor는 호출되지 않는 이유는 무엇입니까?

이 실행
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를!

+0

편집하려는 항목을 두 번 클릭하십시오. 두 번 클릭하면 다른 수정 이벤트가 발생합니다. –

답변

7

:

사용자 정의 편집을 제공하기 위해 사용할 수있는 두 가지 방법이있다. 첫 번째 방법은 편집기 위젯을 작성하여 항목 위에 직접 표시하는 것입니다. 이렇게하려면 createEditor()를 다시 구현하여 편집기 위젯을 제공하고 setEditorData()를 사용하여 모델의 데이터로 편집기를 채우고 델리게이트가 편집기의 데이터로 모델을 업데이트 할 수 있도록 setModelData()를 채워야합니다.

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

이렇게하면 첫 번째 방법을 사용하지 못하게됩니다. 내 생각 엔 모델의 data() 함수가 Qt::EditRole 옵션에 적절한 값을 반환하지 않는다고 생각합니다.

+1

당신이 저를 이끌었습니다, 고마워요! 모델의 플래그에 Qt :: ItemIsEditable을 설정하지 않았습니다. –

+0

나는 비슷한 문제에 직면하고있다.'data()'가'EditRole'을 위해 반환해야하는 것은 무엇인가? –

0

QItemDelegate에서 상속받은 TableView를 구현했습니다. 그럼 비슷한 문제가 생겼어. 나는 'return QItemDelegate :: editorEvent (event, model, option, index);'를 호출하지 않도록 추적했다. editorEvent (...) 메소드에서.

시도해 볼 수 있습니다. 어쩌면 도움이 될지도 모른다. Qt의 AbstractItemDelegate 문서에서

+0

답장을 보내 주셔서 감사합니다. 불행히도 도움이되지 않았습니다. 참고로 QAbstractItemDelegate를 서브 클래 싱하고 QItemDelegate를 서브 클래 싱하는 중입니다 ... –

관련 문제