【发布时间】: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