2009-05-06 23 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

QtのAbstractItemDelegateドキュメントから:

カスタム編集を提供するために、使用することができる2つのアプローチがあります。最初の方法は、エディタウィジェットを作成し、アイテムの上に直接表示することです。これを行うには、createEditor()を再実装してエディタウィジェットを提供し、setEditorData()を使用してモデルからデータを入力し、setModelData()を呼び出してデリゲートがエディタのデータでモデルを更新できるようにする必要があります。

2番目の方法は、editorEvent()を再実装することによって直接ユーザーイベントを処理する方法です。

これは、最初のアプローチを開始するための何かが欠けていると言えます。私の推測では、モデルのdata()関数がQt::EditRoleオプションの適切な値を返さないということです。

+1

あなたはそれに感謝しました。私はモデルのフラグにQt :: ItemIsEditableを設定していませんでした。 –

+0

私は同様の問題に直面しています。 'data()'が 'EditRole'のために返すべきものは何ですか? –

0

私はQItemDelegateから継承したTableViewを実装しました。それから私は似たような問題がありました私は 'return QItemDelegate :: editorEvent(event、model、option、index);'を呼び出さないように追跡しました。 editorEvent(...)メソッド内にあります。

これを試すことができます。多分それは助けます。

+0

返事をありがとう。残念ながら、それは役に立たなかった。 FYI、私はQAbstractItemDelegateをサブクラス化していますが、QItemDelegateではなく... –