c++ - 在 QTableView 中显示来自 QAbstractListModel 的修改数据
问题描述
我有一个QAbstractListModel
存储了一堆自定义对象的对象,您可以通过指定角色来访问模型中自定义对象的不同字段(如果这是对 Qt 角色的不当使用,请告诉我,因为我一定很困惑)。我想以用户友好的方式显示这些数据QTableView
。我可以使用代理模型来显示内容,但问题是我不想显示原始值,我想显示从原始数据派生的特定数据。因此,例如,我不想为ItemA.foo
和都设置一列ItemA.bar
,我只想ItemA.foo - ItemA.bar
在一个列中显示。除此之外,我希望您在模型中获得自动更新功能,如果其中一个ItemA.foo
或ItemA.bar
更改,我希望差异列自动更新和重新计算。
我认为这样做的方法是使用某种表代理模型来侦听源模型,然后用从源模型派生的值填充自己的字段并侦听dataChanged()
来自源模型的信号。然后将此代理模型插入到QTableView
. 但对我来说,这听起来像是应该在视图中完成的事情。或者这是代表应该做的事情?我什至可以在基本模型本身中进行这些计算,并添加特定于应该在表中显示的这些值的角色,但这听起来像是我真的超载了模型的职责。
TLDR:您如何处理来自模型中的数据QTableView
?我应该在基本模型中进行数据操作,然后将其发送到QTableView
?我是否应该使用代理模型来处理基础数据并将其发送到QTableView
?还是我完全误解了什么?
解决方案
并且您可以通过指定角色来访问模型中自定义对象的不同字段
如果您查看Qt::ItemDataRole的文档,您会发现 Qt 模型确实应该为不同的角色提供不同的数据,但每个角色都意味着与角色对应的数据的某些不同用途。例如,最常用的角色可能是Qt::DisplayRole
因为该角色的数据定义了视图中显示的内容,例如它是表格单元格中的文本。如果您对视图的所有其他方面(字体、背景等)感到满意,您可以只QVariant
为模型中的相应角色返回空白,视图会自行计算出这些细节。如果您使用角色作为列的替代品,即返回概念上相同数据项的不同部分,则可能不是角色的预期用途。
对于您问题的另一部分 - 您可以通过使用委托自定义视图中显示的数据的外观。例如,您可以子类化QStyledItemDelegate
,覆盖其displayText方法以显示ItemA.foo - ItemA.bar
而不是仅显示ItemA.foo
,然后将此委托设置到与ItemA.foo
通过setItemDelegateForColumn对应的视图列中。这里的棘手部分是检测会影响代理中显示的文本的列ItemA.foo
和列的变化。ItemA.bar
不久前,我实施了一个专门的课程在我的一个项目中,它监听原始模型某些列的变化,并通过信号发射将变化“重新路由”到另一列。我这样做是为了解决这个问题——尽管从技术上讲,另一个模型列受到影响,而代表未设置到该模型列中,但仍要捕捉代表应显示的内容的变化。
推荐阅读
- azure - 如何在 Azure Logic App 中处理异常
- r - 基于计数的组条形图
- python - 跟踪市场情绪交易策略的时间序列的历史。错误:“numpy.bool_”类型的参数不可迭代
- angular - Service Worker 未注册或无法控制启动 URL
- visual-studio-code - 如何在文件导航器中删除?
- javascript - 获取已调用静态函数的类的名称
- c# - 如何将字符串列表/集合绑定到 WPF 中数据网格中列的行?
- java - 用空格和可选引号分隔的 csv 文件的正则表达式
- google-sheets-query - Google 表格 - 如何查询自定义日期范围?
- python - 按多列对数据框进行分组