【问题标题】:Qt: data conversion on the model/view frameworkQt:模型/视图框架上的数据转换
【发布时间】:2016-12-03 22:37:49
【问题描述】:

我必须将数据适应逻辑放在哪里,在委托级别还是在模型级别?

数据适应逻辑我的意思是当数据必须在检索和记录时进行转换。例如,在 sqlite 中,date 类型不存在,QSqlTableModel 将日期检索为字符串(但它们是日期,只是这没有反映在列类型中),从而使QStyledItemDelegate 在编辑时显示QLineEdit

要将其编辑为日期,您可以做两件事:

  • 安装一个自定义委托,它将QVariant 字符串转换为QVariant 日期并创建一个QDateEdit(以及保存版本时的反向转换)。

  • 派生QSqlTableModel 以对相应列执行相同的转换,而无需安装任何自定义委托(QStyledItemDelegate 将识别QVariant 日期类型并自动显示QDateEdit)。

我必须做什么,或者在 Qt 中“标准”或通常的做法是什么?

优点和缺点:

  • 在委托方法中,模型保持不变。
  • 在模型方法中,视图保持不变(不需要派生视图)。
  • 使用该模型的任何视图都必须为相应的列安装相同的自定义委托。在模型方法中,每个视图都可以在不安装任何委托的情况下看到更改,我认为这是我认为的最佳点,因为模型被认为是共享的,但视图不是。
  • 同样的委托类也可用于标题。在模型方法中,如果您还想对它们进行任何转换,则必须派生 headerDatas 和 datas 方法。
  • 在委托方法中,如果要更改视图的模型,则必须卸载以前安装的委托,这会迫使您将委托与模型同步(委托绑定到特定表模型的特定列)。

【问题讨论】:

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

标签: c++ qt model delegates type-conversion


【解决方案1】:

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

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

当然,视图需要一个知道如何处理带有日期的QVariant 的编辑器委托,如果 Qt 默认提供了一个,我不记得了。如果没有,您必须添加一个。但是这些问题是分开的:您正在为通用视图灌输编辑日期的能力,并且您正在为您的模型灌输正确的日期表示。两者之间的耦合是最小的:视图不需要知道你的特定模型的特性,你的模型也不需要知道视图本身的任何特殊之处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多