在 QTableView 中显示来自 QAbstractListModel 修改后的数据
Display modified data from QAbstractListModel in QTableView
我有一个QAbstractListModel
,里面存储了一堆自定义对象,你可以通过指定角色访问模型中自定义对象的不同字段(如果这是对Qt 角色让我知道,因为我一定很困惑)。我想以用户友好的方式显示此数据 QTableView
。我可以使用代理模型显示内容,但问题是我不想显示原始值,我想显示来自原始数据的特定数据 derived。因此,例如,我不想要 ItemA.foo
和 ItemA.bar
的列,我只想在一个列中显示 ItemA.foo - ItemA.bar
。除此之外,我想要你通过模型获得的自动更新功能,如果 ItemA.foo
或 ItemA.bar
发生变化,我希望差异列自动更新和重新计算。
我认为这样做的方法是使用某种侦听源模型的 table 代理模型,然后用从源模型派生的值填充它自己的字段,并且监听来自源模型的 dataChanged()
信号。然后将此代理模型插入 QTableView
。但对我来说,这听起来像是 应该 在视图中完成的事情。或者这是应该由委托人完成的事情吗?我什至可以在基础模型本身中进行这些计算,并添加特定于这些值的角色,这些值应该显示在 table 中,但这听起来好像我真的超载了模型的责任。
TLDR: 如何在 QTableView
中操作模型中的数据?我应该在基本模型中进行数据操作,然后将其发送到 QTableView
吗?我应该使用代理模型来处理基础数据并将其发送到 QTableView
吗?还是我完全误解了什么?
and you can access the different fields of the custom objects in the model by specifying a role
如果您查看 Qt::ItemDataRole 的文档,您会发现 Qt 模型确实应该为不同的角色提供不同的数据,但每个角色都意味着与该角色对应的数据的某些不同用途。例如,最常用的角色可能是 Qt::DisplayRole
,因为该角色的数据定义了视图中显示的内容,例如它是 table 单元格中的文本。如果您对视图的所有其他方面感到满意 - 字体、背景等 - 您可以 return 为模型中的相应角色清空 QVariant
,视图会自行确定这些细节。如果您使用角色代替列,即 return 概念上相同数据项的不同部分,这可能不是角色的预期用途。
对于您问题的另一部分 - 您可以通过在我的一个项目中使用 delegate. For example, you could subclass QStyledItemDelegate
, override its displayText method to display ItemA.foo - ItemA.bar
instead of just ItemA.foo
and then set this delegate into the column of your view corresponding to ItemA.foo
via setItemDelegateForColumn. The tricky part here would be to detect changes in both ItemA.foo
and ItemA.bar
columns which would affect the text displayed in the delegate. A while back I implemented a dedicated class 自定义视图中显示的数据的外观,该项目监听原始模型某些列的变化并通过信号发射将更改“重新路由”到另一列。我这样做是为了解决这个问题——捕捉委托应该显示的变化,尽管从技术上讲,另一个模型列受到影响,但未设置委托。
我有一个QAbstractListModel
,里面存储了一堆自定义对象,你可以通过指定角色访问模型中自定义对象的不同字段(如果这是对Qt 角色让我知道,因为我一定很困惑)。我想以用户友好的方式显示此数据 QTableView
。我可以使用代理模型显示内容,但问题是我不想显示原始值,我想显示来自原始数据的特定数据 derived。因此,例如,我不想要 ItemA.foo
和 ItemA.bar
的列,我只想在一个列中显示 ItemA.foo - ItemA.bar
。除此之外,我想要你通过模型获得的自动更新功能,如果 ItemA.foo
或 ItemA.bar
发生变化,我希望差异列自动更新和重新计算。
我认为这样做的方法是使用某种侦听源模型的 table 代理模型,然后用从源模型派生的值填充它自己的字段,并且监听来自源模型的 dataChanged()
信号。然后将此代理模型插入 QTableView
。但对我来说,这听起来像是 应该 在视图中完成的事情。或者这是应该由委托人完成的事情吗?我什至可以在基础模型本身中进行这些计算,并添加特定于这些值的角色,这些值应该显示在 table 中,但这听起来好像我真的超载了模型的责任。
TLDR: 如何在 QTableView
中操作模型中的数据?我应该在基本模型中进行数据操作,然后将其发送到 QTableView
吗?我应该使用代理模型来处理基础数据并将其发送到 QTableView
吗?还是我完全误解了什么?
and you can access the different fields of the custom objects in the model by specifying a role
如果您查看 Qt::ItemDataRole 的文档,您会发现 Qt 模型确实应该为不同的角色提供不同的数据,但每个角色都意味着与该角色对应的数据的某些不同用途。例如,最常用的角色可能是 Qt::DisplayRole
,因为该角色的数据定义了视图中显示的内容,例如它是 table 单元格中的文本。如果您对视图的所有其他方面感到满意 - 字体、背景等 - 您可以 return 为模型中的相应角色清空 QVariant
,视图会自行确定这些细节。如果您使用角色代替列,即 return 概念上相同数据项的不同部分,这可能不是角色的预期用途。
对于您问题的另一部分 - 您可以通过在我的一个项目中使用 delegate. For example, you could subclass QStyledItemDelegate
, override its displayText method to display ItemA.foo - ItemA.bar
instead of just ItemA.foo
and then set this delegate into the column of your view corresponding to ItemA.foo
via setItemDelegateForColumn. The tricky part here would be to detect changes in both ItemA.foo
and ItemA.bar
columns which would affect the text displayed in the delegate. A while back I implemented a dedicated class 自定义视图中显示的数据的外观,该项目监听原始模型某些列的变化并通过信号发射将更改“重新路由”到另一列。我这样做是为了解决这个问题——捕捉委托应该显示的变化,尽管从技术上讲,另一个模型列受到影响,但未设置委托。