Qt 模型可以注册为 QObject 的属性吗?
首先,让我们澄清 Qt 模型确实可以注册为 QObject 的属性使用宏。例如,考虑这里的 AnimalModel:
http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html#qabstractitemmodel
将模型传递到根上下文
将模型传递到 QuickView 的根上下文是一种简单的方法。下面是一个示例:
QuickView view; view.rootContext()->setContextProperty("myModel", &model); // where "model" is the AnimalModel
同样,通过 Qml 宏注册的对象可以添加到视图中:
view.rootContext()->setContextProperty("obj", pDataObject);
具有模型属性的 QObject
但是,如果您想要一个包含任何类型数据的模型的 QObject 该怎么办?这是一个示例实现:
class DataObject : public QObject { Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged) ... AnimalModel m_modelAnimals; // Q_PROPERTY(AnimalModel modelAnimals READ modelAnimals NOTIFY modelAnimalsChanged) };
与评论相反,这个属性注册确实是可能的,但它不是一个 AnimalModel,而是一个 AnimalModel *。只要模型继承自 QAbstractListModel,就不需要 NOTIFY 部分。模型内的更改会自动反映。
灵活的模型实现
更灵活的方法是创建一个存储 QObject * 的模型。通过 QML,您可以创建具有各种属性的不同对象并将它们合并到模型中。然后,模型提供一个返回对象的角色,允许您查询和利用其属性。
无模式模型
此外,您可以实现一个使用 QQmlListProperty 和 Q_CLASSINFO("DefaultProperty", "container") 的“无架构”模型。这使您能够动态地构建模型或使用 QML 的声明性语法。重要的是,这种方法还提供了以声明方式添加或删除对象的能力。
具有动态数据的模型示例
这里是支持任何模型的示例实现数据类型:
class List : public QAbstractListModel { Q_OBJECT QList<QObject *> _data; Q_PROPERTY(int size READ size NOTIFY sizeChanged) Q_PROPERTY(QQmlListProperty<QObject> content READ content) Q_PROPERTY(QObject * parent READ parent WRITE setParent) Q_CLASSINFO("DefaultProperty", "content") public: List(QObject *parent = 0) : QAbstractListModel(parent) { } // rest of the class ... };
该模型可用于保存任何 QObject 或派生类,包括QML 的 QtObject。它可以用作 ListView 的模型,并支持通过槽或声明性语法进行动态填充。此外,它还处理对象所有权,并可以嵌套以创建分隔的树模型。
委托加载器
要在视图中显示不同的对象类型,您可以使用委托的加载器,根据对象的类型加载适当的 QML 文件。
通用排序和过滤代理
为了增强上述模型的可用性,您还可以实现一个简单且动态的通用排序和过滤代理。这是一个示例实现要点:
https://gist.github.com/gabor-boros/9e756b6dba5011c0286069feedbd3cc8
以上是Qt 模型可以注册为 QObject 的属性吗?的详细内容。更多信息请关注PHP中文网其他相关文章!