【问题标题】:Display modified data from QAbstractListModel in QTableView在 QTableView 中显示来自 QAbstractListModel 的修改数据
【发布时间】:2021-12-22 13:51:00
【问题描述】:

我有一个QAbstractListModel,其中存储了一堆自定义对象,您可以通过指定角色来访问模型中自定义对象的不同字段(如果这是对 Qt 角色的不当使用,请告诉我知道,因为我一定很困惑)。我想以用户友好的QTableView 显示这些数据。我可以使用代理模型显示内容,但问题是我不想显示原始值,我想显示从原始数据派生的特定数据。例如,我不想要ItemA.fooItemA.bar 的列,我只想在一个列中显示ItemA.foo - ItemA.bar。除此之外,我希望您在模型中获得自动更新功能,如果 ItemA.fooItemA.bar 发生变化,我希望差异列自动更新和重新计算。

我认为这样做的方法是使用某种表代理模型来侦听源模型,然后使用从源模型派生的值填充自己的字段并侦听 dataChanged() 信号从源模型。然后将此代理模型插入QTableView。但对我来说,这听起来像是应该在视图中完成的事情。或者这是代表应该做的事情?我什至可以在基本模型本身中进行这些计算,并添加特定于应该在表中显示的这些值的角色,但这听起来像是我真的超载了模型的职责。

TLDR:您如何处理来自QTableView 中模型的数据?我是否应该在基本模型中进行数据操作,然后将其发送到QTableView?我是否应该使用代理模型来处理基础数据并将其发送到QTableView?还是我完全误解了什么?

【问题讨论】:

    标签: c++ qt qt5


    【解决方案1】:

    您可以通过指定角色来访问模型中自定义对象的不同字段

    如果您查看Qt::ItemDataRole 的文档,您会发现Qt 模型确实应该为不同的角色提供不同的数据,但是每个角色都意味着与角色对应的数据的某些不同用途。例如,最常用的角色可能是Qt::DisplayRole,因为该角色的数据定义了视图中显示的内容,例如它是表格单元格中的文本。如果您对视图的所有其他方面(字体、背景等)感到满意,您可以为模型中的相应角色返回空的QVariant,视图会自行计算出这些细节。如果您使用角色代替列,即返回概念上相同数据项的不同部分,则可能不是角色的预期用途。

    对于您问题的另一部分 - 您可以通过使用 delegate 自定义视图中显示的数据的外观。例如,您可以继承QStyledItemDelegate,覆盖其displayText 方法以显示ItemA.foo - ItemA.bar 而不仅仅是ItemA.foo,然后通过setItemDelegateForColumn 将此委托设置到与ItemA.foo 对应的视图列中。这里棘手的部分是检测ItemA.fooItemA.bar 列中的更改,这会影响代理中显示的文本。不久前,我在我的一个项目中实现了一个专用的class,它监听原始模型某些列的变化,并通过信号发射将变化“重新路由”到另一列。我这样做是为了解决这个问题 - 尽管从技术上讲,另一个模型列受到影响,但未设置委托,但要捕获委托应显示的内容的变化。

    【讨论】:

    • 非常感谢 Dmitry,这让我明白了很多,尤其是对如何使用 QStyledItemDelegate 的解释。我也会检查你的代码!我认为我最终要做的是创建一个“操作员”委托,允许在给定模型的两列/行(如果我很懒,则为角色;])的情况下执行任意数学运算。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多