Qt 使用带有QDataWidgetMapper和QLabel的委托

Qt 使用带有QDataWidgetMapper和QLabel的委托,qt,Qt,我试图使用委托来定制使用QDataWidgetMapper时模型中数据的显示方式 我有两个不同版本的小部件,一个是仅查看(数据显示在QLabels中),另一个用于编辑数据(数据显示在适当的编辑器中) 后者与代理完美配合,一切正常 正如你可能已经猜到的,第一个问题出现了。。。使用QDataWidgetMapper将模型的节映射到QLabels时,不会调用委托,并且对于具有常规数据(字符串、Int等)的节,数据会正确显示,但对于具有自定义数据类型(一种列表)的模型节,不会显示任何数据我想使用委托将其

我试图使用委托来定制使用QDataWidgetMapper时模型中数据的显示方式

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

后者与代理完美配合,一切正常

正如你可能已经猜到的,第一个问题出现了。。。使用QDataWidgetMapper将模型的节映射到QLabels时,不会调用委托,并且对于具有常规数据(字符串、Int等)的节,数据会正确显示,但对于具有自定义数据类型(一种列表)的模型节,不会显示任何数据我想使用委托将其格式化为字符串

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

仔细查看之后,我发现,当使用QLabels显示数据时,虽然我使用其方法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);
}
代码输出:

DELEGATE: SET EDITOR DATA 1
// NOTHING ?!

DELEGATE: PAINT 1
DELEGATE: PAINT 2
结果我得到了

  • 我的editorWidget中包含正确的数据(无论该节包含何种数据类型:常规或自定义,当然只要编辑器处理该类型)
  • “我的标签”仅在节包含常规类型的数据时显示数据,因为未调用委托
  • 我的视图将显示所有内容,因为每个部分都调用了代理
因此,我的问题是:

  • 当映射的小部件是QLabel时,为什么不调用委托
  • 在这种情况下,当数据类型为常规数据时,为什么还要显示数据?魔法
非常感谢,如果答案显而易见,我会提前道歉(但即使如此,也要感谢你指出:p)


ixM

这是来自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));
}
在第一种情况下,当您未指定属性委托时,将使用该委托,而在第二种情况下,通过传递委托,将数据直接设置为widget


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

好的,非常感谢!事实上,我确实查看了QDataWidgetMapper的源代码,但显然是为了fast,忽略了这个事实。我想只要删除属性“text”就可以使用委托的方法paint。谢谢
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));
}