使用带有QDataWidgetMapper和QLabel的委托

时间:2011-08-15 12:04:00

标签: qt

我正在尝试使用委托来自定义使用QDataWidgetMapper时模型中数据的显示方式。

我有两个不同版本的小部件,一个是仅查看(数据显示在QLabels中),另一个用于编辑数据(数据显示在适当的编辑器中)。

后者与代表完美配合,一切都很好。

您可能已经猜到第一个问题出现了...当使用QDataWidgetMapper将模型的各个部分映射到QLabel时,从不调用委托,并且对于具有常规数据的部分(字符串)正确显示数据,整数,...)但我的模型的部分没有显示数据与自定义数据类型(一种列表),我想使用委托格式化为字符串。

当QTableView中显示相同的数据时,我已经成功执行了此操作(显示数据时调用了委托的方法paint())。

在仔细观察之后,我已经看到了,当使用QLabel显示数据时,虽然我已经使用方法setItemDelegate明确地将委托关联到QDataWidgetMapper,但从未调用委托。 ()。

因此,在综合中,假设一个类CustomItemDelegate,它使用虚方法继承QStyledItemDelegate:

void CustomItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    qDebug() << "DELEGATE: PAINT" << index.column();
    QStyledItemDelegate::paint(painter, option, index);
}

void CustomItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
    qDebug() << "DELEGATE: SET EDITOR DATA" << index.column();
    QStyledItemDelegate::setEditorData(editor, index);
}

以及包含以下内容的小部件:

QDataWidgetMapper* mapper = new QDataWidgetMapper();
CustomItemDelegate* delegate = new CustomItemDelegate();
mapper->setModel(model);
mapper->setItemDelegate(delegate);

mapper->addMapping(editorWidget, 1);
mapper->addMapping(label, 2, "text");

mapper->toFirst();

QTableView* view = new QTableView();
CustomItemDelegate* delegate2 = new CustomItemDelegate();
view->setModel(model);
view->setItemDelegate(delegate2);

代码输出:

DELEGATE: SET EDITOR DATA 1
// NOTHING ?!

DELEGATE: PAINT 1
DELEGATE: PAINT 2

因此我得到了

  • 我的editorWidget中包含正确的数据(该部分包含的数据类型:常规或自定义,只要编辑器处理课程类型),
  • 我的标签仅显示数据,如果该部分包含常规类型的数据,因为未调用委托
  • 我的视图会在为每个部分调用委托时显示一切正常

所以我的问题是:

  • 当映射的小部件是QLabel时,为什么不调用委托?
  • 在这种情况下,如果数据类型是常规的,数据是如何显示的?魔法?

非常感谢,如果答案显而易见,我会提前道歉(但即便如此,也要感谢你指出:P),

IXM

1 个答案:

答案 0 :(得分:3)

这是QT中填充小部件的代码

void QDataWidgetMapperPrivate::populate(WidgetMapper &m)
{
    if (m.widget.isNull())
        return;

    m.currentIndex = indexAt(m.section);
    if (m.property.isEmpty())
        delegate->setEditorData(m.widget, m.currentIndex);
    else
        m.widget->setProperty(m.property, m.currentIndex.data(Qt::EditRole));
}

在第一种情况下,如果未指定属性,则使用委托,而在第二种情况下,通过传递委托直接将数据设置为小部件

我不知道为什么它是这样设计的,但这就是它目前的工作方式!