我正在尝试使用委托来自定义使用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
因此我得到了
所以我的问题是:
非常感谢,如果答案显而易见,我会提前道歉(但即便如此,也要感谢你指出:P),
IXM
答案 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));
}
在第一种情况下,如果未指定属性,则使用委托,而在第二种情况下,通过传递委托直接将数据设置为小部件。
我不知道为什么它是这样设计的,但这就是它目前的工作方式!