首页 >后端开发 >C++ >Qt 模型可以注册为 QObject 的属性吗?

Qt 模型可以注册为 QObject 的属性吗?

Barbara Streisand
Barbara Streisand原创
2024-12-24 18:34:04806浏览

Can Qt Models Be Registered as Properties of QObjects?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn