Qt 提供了将 C++ 模型与 QML 相结合的可能性并在文档中建议了三种方法:
QStringList
QObjectList
QAbstractItemModel
前两者使用起来非常简单,例如QObjectList
:
// in C++
QList<QObject*> dataList;
dataList.append(new DataObject("Item 1", "red"));
// in QML
ListView {
model: dataList
delegate: Text { text: name }
}
但它们都有一个强烈的警告:
注意:视图无法知道a的内容
QList 已更改。如果QList发生变化,需要重置
模型 [...]
QAbstractItemModel
很难与对象一起使用,因为对象属性不直接公开,因此保持它们同步需要相当多的努力。
但是,可以将一个QList
in a QAbstractItemModel
并得到一个超级简单的模型。看这里:实施1, 实施2
Qt 没有原生实现这个有什么原因吗?表现?内存管理问题?这似乎是一个明显的好主意ObjectModel他们已经实现了类似的东西。
使用的一个突出缺点QObject
作为模型项是因为基类非常大,它是一种“上帝对象”(这是一种反模式),包含很多大多数时候你并不真正需要的东西。因此,除了您可能拥有的任何模型数据之外,它还有大约 160 字节的“开销”。如果您有一个包含大量物品的大模型,并且物品本身相对较小,这可能会出现问题。你最终会承担很多开销。
A QObjectList
作为一个模型总是一个坏主意,除非你正在做一些完全微不足道的事情。由于它没有实现适当的接口来通知引用视图的更改,唯一的方法是强制更新,这将每次重新绘制整个模型而不仅仅是更改。
对于项目对象是什么没有要求,只要正确实现模型即可。
第二种实现特别有用,原因如下:
- 您无需为每个使用场景实施具有固定角色的特定“静态”模型
- 您的模型项可以具有根本不同的属性,您不限于模型“架构”
- 因为您正在处理,所以您会自动收到 QML 中的绑定通知
QObject
and Q_PROPERTY
- 您可以以声明式方式定义模型,甚至可以嵌套模型来创建树结构,这是您无法做到的
ListModel
.
- 您可以在纯 QML 中定义实际的模型项,而无需一直重新编译,即快速原型设计,完成后,您可以简单地将对象移植到 C++
- 同时,除了所有优点之外,该模型实际上比常规“刚性”模型更容易实现和维护,角色查找速度更快,因为您本质上只有一个
object
角色并且无需任何查找,无需为角色实现数据更改信号等等...简单
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)