2016-12-03 40 views
1

我必须在委托级别或模型级别放置数据适应逻辑的位置?Qt:模型/视图框架上的数据转换

With 数据适配逻辑我的意思是当数据必须在检索和记录时被转换。例如,在sqlite中,date类型不存在,并且QSqlTableModel将字符串检索为日期(但它们是日期,只是它未反映在列类型中),因此QStyledItemDelegate在编辑时显示QLineEdit

编辑它作为一个日期,你可以做两件事情:

  • 安装哪个变换QVariant串到QVariant日期并创建一个自定义委托一个QDateEdit(并保存版本时,逆转变)。

  • 推导QSqlTableModel做了相应列相同的变换,无需安装任何自定义委托(该QStyledItemDelegate将识别QVariant日期类型,并自动显示QDateEdit)。

我该做什么,或者什么是“标准”或通常在Qt中使用它的方式?

利弊:

  • 在委托方法,模型是不变。
  • 在模型方法中,视图是未触及的(它不需要派生视图)。
  • 使用模型的任何视图都必须为相应的列安装相同的自定义委托。在模型方法中,我认为每个视图都可以在不安装任何代理的情况下看到更改,我认为它是最佳点,因为模型被认为是共享的,但视图不是。
  • 相同的委托类也可以用于标题。在模型方法中,如果您也想对其进行任何转换,则必须推导出headerDatadata的方法。
  • 在委托方法上,如果要更改视图的模型,则必须卸载先前安装的委托,这将强制您使用模型同步委托(委托绑定到特定表模型的特定列)。
+3

我会在模型级别执行此操作。如果您不想触摸模型,则可以使用“QIdentityProxyModel”进行数据转换。 –

回答

1

您需要一个viewmodel:一个适配器,为您的视图提供格式正确的数据以便查看/编辑。

这种视图模型是作为代理模型实现的。在这种特定情况下,它可能是一个非常简单的QIdentityProxyModel,它将字符串转换为日期,反之亦然。

当然,这个视图需要一个知道如何处理带有日期的QVariant的编辑器委托,如果Qt默认提供了一个,我不会记得。如果没有,你必须添加一个。但是关注点是分开的:你在编辑一个通用的视图并具有编辑日期的能力,而且你正在使用正确的日期表示来填充你的模型。两者之间的耦合是最小的:视图不需要意识到您的具体模型的特性,您的模型也不需要意识到视图本身中的任何特殊内容。