Qt 使用带有QDataWidgetMapper和QLabel的委托
我试图使用委托来定制使用QDataWidgetMapper时模型中数据的显示方式 我有两个不同版本的小部件,一个是仅查看(数据显示在QLabels中),另一个用于编辑数据(数据显示在适当的编辑器中) 后者与代理完美配合,一切正常 正如你可能已经猜到的,第一个问题出现了。。。使用QDataWidgetMapper将模型的节映射到QLabels时,不会调用委托,并且对于具有常规数据(字符串、Int等)的节,数据会正确显示,但对于具有自定义数据类型(一种列表)的模型节,不会显示任何数据我想使用委托将其格式化为字符串 当相同的数据显示在QTableView中时,我已经成功地执行了此操作(显示数据时调用委托的paint()方法) 仔细查看之后,我发现,当使用QLabels显示数据时,虽然我使用其方法setItemDelegate()将委托显式关联到QDataWidgetMapper,但从未调用该委托 因此,在合成中,假设一个类CustomItemDelegate使用虚拟方法继承QStyledItemDelegate:Qt 使用带有QDataWidgetMapper和QLabel的委托,qt,Qt,我试图使用委托来定制使用QDataWidgetMapper时模型中数据的显示方式 我有两个不同版本的小部件,一个是仅查看(数据显示在QLabels中),另一个用于编辑数据(数据显示在适当的编辑器中) 后者与代理完美配合,一切正常 正如你可能已经猜到的,第一个问题出现了。。。使用QDataWidgetMapper将模型的节映射到QLabels时,不会调用委托,并且对于具有常规数据(字符串、Int等)的节,数据会正确显示,但对于具有自定义数据类型(一种列表)的模型节,不会显示任何数据我想使用委托将其
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时,为什么不调用委托
- 在这种情况下,当数据类型为常规数据时,为什么还要显示数据?魔法
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));
}