首页 > 后端开发 > C++ > 如何创建用于 QML 的通用对象模型?

如何创建用于 QML 的通用对象模型?

Linda Hamilton
发布: 2024-12-28 21:22:12
原创
623 人浏览过

How to Create a Generic Object Model for Use in QML?

如何创建在 QML 中使用的通用对象模型

要将 Qt 模型注册为 QObject 的属性,您可以使用Q_PROPERTY 宏。但是,并非所有模型类型都与此方法兼容。

使用 AnimalModel

虽然将 QAbstractListModel 直接传递到 QML 视图很常见,但无法注册它作为 QObject 的属性使用Q_PROPERTY.

创建动态对象模型

要克服此限制,您可以创建一个自定义 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)
};
登录后复制

这将创建一个 QObject,其属性返回指向 AnimalModel 的指针。然后可以在 QML 中访问该模型,如下所示:

DataObject {
    modelAnimals: {
        // Manipulate the model here
    }
}
登录后复制

无模式模型

如果您需要更大的灵活性,您可以创建无模式模型允许具有任意属性的对象。要实现此目的:

  1. 创建存储 QObject 的 QAbstractListModel 或 QObject 模型。
  2. 提供返回对象的单个对象角色。
  3. 使用Loader作为委托,根据对象实例化不同的QML UI实现类型。
  4. 为模型实现 QQmlListProperty 和 Q_CLASSINFO("DefaultProperty", "container"),以允许使用 QML 的声明性语法进行动态组合。

使用列表

这是一个示例支持各种对象类型的通用列表模型:

class List : public QAbstractListModel
{
    Q_OBJECT
    QList<QObject *> _data;

    ...
};
登录后复制

您可以使用以下方式注册此模型:

qmlRegisterType<List>("Core", 1, 0, "List");
登录后复制

并在 QML 中使用它,如下所示:

List {
    QtObject { ... }
    QtObject { ... }
    List {
        QtObject { ... }
        QtObject { ... }
    }
}
登录后复制

动态排序和过滤

为了使这个模型更可用,您可以实现排序和过滤代理:

class SortingFilteringProxy : public QAbstractListModel
{
    Q_OBJECT
    QSortFilterProxyModel _proxy;

    ...
};
登录后复制

这允许基于所包含对象的任意属性进行高级过滤和排序功能。

以上是如何创建用于 QML 的通用对象模型?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板