3

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が編集イベントごとに2回呼び出されるだけです。createEditorはありません。

4

2 に答える 2

9

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

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

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

これは、最初のアプローチをトリガーする何かが欠けていると言っているようです。私の推測では、モデルのdata()関数がQt::EditRoleオプションに対して適切な値を返していないということです。

于 2009-05-06T17:18:17.500 に答える
0

QItemDelegate から継承した TableView を実装しました。それから私は同様の問題を抱えていました。「return QItemDelegate::editorEvent(event, model, option, index);」を呼び出さないように追跡しました。editorEvent(...) メソッドで。

これを試すことができます。多分それは役立ちます。

于 2009-05-06T11:48:35.920 に答える