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 两次——没有 createEditor!

4

2 回答 2

9

来自 Qt 的AbstractItemDelegate文档:

要提供自定义编辑,可以使用两种方法。第一种方法是创建一个编辑器小部件并将其直接显示在项目的顶部。为此,您必须重新实现 createEditor() 以提供编辑器小部件, setEditorData() 以使用模型中的数据填充编辑器,以及 setModelData() 以便委托可以使用来自编辑器的数据更新模型。

第二种方法是通过重新实现 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 回答