首页 > 解决方案 > 在 QTableView 中显示来自 QAbstractListModel 的修改数据

问题描述

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

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

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

标签: c++qtqt5

解决方案


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

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

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


推荐阅读