我必须在委托级别或模型级别放置数据适应逻辑的位置?Qt:模型/视图框架上的数据转换
With 数据适配逻辑我的意思是当数据必须在检索和记录时被转换。例如,在sqlite中,date
类型不存在,并且QSqlTableModel
将字符串检索为日期(但它们是日期,只是它未反映在列类型中),因此QStyledItemDelegate
在编辑时显示QLineEdit
。
编辑它作为一个日期,你可以做两件事情:
安装哪个变换
QVariant
串到QVariant
日期并创建一个自定义委托一个QDateEdit
(并保存版本时,逆转变)。推导
QSqlTableModel
做了相应列相同的变换,无需安装任何自定义委托(该QStyledItemDelegate
将识别QVariant
日期类型,并自动显示QDateEdit
)。
我该做什么,或者什么是“标准”或通常在Qt中使用它的方式?
利弊:
- 在委托方法,模型是不变。
- 在模型方法中,视图是未触及的(它不需要派生视图)。
- 使用模型的任何视图都必须为相应的列安装相同的自定义委托。在模型方法中,我认为每个视图都可以在不安装任何代理的情况下看到更改,我认为它是最佳点,因为模型被认为是共享的,但视图不是。
- 相同的委托类也可以用于标题。在模型方法中,如果您也想对其进行任何转换,则必须推导出
headerData
和data
的方法。 - 在委托方法上,如果要更改视图的模型,则必须卸载先前安装的委托,这将强制您使用模型同步委托(委托绑定到特定表模型的特定列)。
我会在模型级别执行此操作。如果您不想触摸模型,则可以使用“QIdentityProxyModel”进行数据转换。 –