gpt4 book ai didi

qt - 使用带有 QDataWidgetMapper 和 QLabel 的委托(delegate)

转载 作者:行者123 更新时间:2023-12-04 06:17:19 24 4
gpt4 key购买 nike

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

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

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

正如您可能已经猜到的那样,第一个问题会出现......当使用 QDataWidgetMapper 将我的模型的部分映射到 QLabels 时,永远不会调用委托(delegate),并且对于具有常规数据(字符串、整数、 ...)但我的模型部分没有显示任何数据,我想使用委托(delegate)将其格式化为字符串的自定义数据类型(一种列表)。

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

在仔细观察它之后,我已经能够看到,当使用 QLabels 显示数据时,尽管我已经使用其方法 setItemDelegate() 将委托(delegate)与 QDataWidgetMapper 显式关联起来,但从未调用过委托(delegate)。

所以在综合中,假设一个类 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 中包含正确的数据(该部分包含的任何数据类型:常规或自定义,只要编辑器处理当然类型),
  • 如果该部分包含常规类型的数据,则我的标签仅显示数据,因为未调用委托(delegate)
  • 我的 View 会显示一切正常,因为每个部分都调用了代表

  • 所以我的问题是:
  • 当映射的小部件是 QLabel 时,为什么不调用委托(delegate)?
  • 在这种情况下,数据类型为规则的情况下,数据怎么会显示出来呢?魔法?

  • 非常感谢,如果答案很明显,我提前道歉(但即便如此,感谢您指出: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));
    }

    在第一种情况下,您未指定属性委托(delegate),而在第二种情况下,数据设置为小部件 直接通过您的代表 .

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

    关于qt - 使用带有 QDataWidgetMapper 和 QLabel 的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7064664/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com