c++ - Qt:模型/ View 框架上的数据转换

标签 c++ qt model delegates type-conversion

我必须在哪里放置数据适配逻辑,是在委托(delegate)级别还是在模型级别?

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

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

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

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

我必须做什么,或者在 Qt 中执行此操作的“标准”或通常方法是什么?

优缺点:

  • 在委托(delegate)方法中,模型未受影响。
  • 在模型方法中, View 未受影响(不需要派生 View )。
  • 任何使用该模型的 View 都必须为相应的列安装相同的自定义委托(delegate)。在模型方法中,每个 View 都可以在不安装任何委托(delegate)的情况下看到更改,我认为这是我认为的最佳点,因为模型被认为是共享的,但 View 不是。
  • 同样的委托(delegate)类也可以用于 header 。在模型方法中,如果您想对它们进行任何转换,则必须派生 headerDatadata 方法。
  • 在委托(delegate)方法中,如果你想改变 View 的模型,你必须卸载以前安装的委托(delegate),这迫使你将委托(delegate)与模型同步(委托(delegate)绑定(bind)到特定表模型的特定列).

最佳答案

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

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

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

关于c++ - Qt:模型/ View 框架上的数据转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953268/

相关文章:

c++ - 如何在 C++ 中访问函数作用域变量?

c++ - 用给定面值的最少硬币数量来定额。贪婪的问题

c++ - 使用 POCO 启动后台进程

qt - 如何在 Qt 中显示工具提示

php - Symfony2 和其他 MVC 框架中的模型?

c++ - 为什么当我们按值从方法返回对象时调用复制构造函数

c++ - 动态分配的正确用法是什么——应该避免这种情况吗? (在不同的范围内使用 new 和 delete)

c++ - LNK2019 QObject 未解析的外部符号

使用 Gibbs 采样器的 GMM 的 C++ 实现,即 Dirichlet 过程高斯混合模型

python - Django 保存空白值