将 C++ 类型的属性暴露给 QML(Exposing Attributes of C++ Types to QML)

本文档介绍了如何在QML中通过C++扩展功能,重点讨论数据类型处理、所有权规则、属性暴露(包括对象类型和列表类型属性)、方法(包括Qt插槽)的公开以及信号的访问。QML能够直接访问Q_OBJECT派生类的属性、公共槽和信号,而Q_PROPERTY用于指定可读写属性。对象类型属性和列表属性可通过QML类型系统注册来访问,同时注意数据所有权和类型转换。方法的Q_INVOKABLE和公共槽可用于从QML调用,而信号则允许双向通信。

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

目录

1.数据类型处理和所有权

       2.暴露属性

       2.1 带有对象类型的属性

       2.2 具有对象列表类型的属性

       2.3 分组属性

3. 暴露方法(包括Qt插槽)

4.暴露的信号


QML可以很容易地通过c++代码中定义的功能进行扩展。由于QML引擎与Qt元对象系统的紧密集成,任何由qobject派生类适当公开的功能都可以从QML代码访问。这使得可以直接从QML访问c++数据和函数,通常很少或不需要修改。QML引擎能够通过元对象系统对QObject实例进行内省。这意味着任何QML代码都可以访问qobject派生类实例的以下成员:

  • Properties (属性)
  • Methods (providing they are public slots or flagged with Q_INVOKABLE) (方法)
  • Signals (信号)

(此外,如果使用Q_ENUMS声明了枚举,那么枚举也是可用的。详见QML和c++之间的数据类型转换。)

通常,无论qobject派生类是否已注册到QML类型系统,都可以从QML访问这些类。但是,如果以一种需要引擎访问附加类型信息的方式使用类——例如,如果将类本身用作方法参数或属性,或者以这种方式使用其枚举类型之一则可能需要注册该类。
还要注意,本文档中涉及的许多重要概念在使用c++编写QML扩展教程中得到了演示。

1.数据类型处理和所有权

从c++传输到QML的任何数据,无论是作为属性值、方法参数或返回值,还是作为信号参数值,都必须是QML引擎支持的类型。
默认情况下,该引擎支持许多Qt c++类型,并可以在从QML中使用时自动将它们转换为适当的类型。此外,向QML类型系统注册的c++类可以用作数据类型,如果适当地注册,它们的枚举也可以用作数据类型。有关更多信息,请参阅QML和c++之间的数据类型转换。
此外,数据所有权规则也有缺点

2.暴露属性

可以使用Q_PROPERTY()宏为任何从qobject派生的类指定属性。属性是具有关联的读函数和可选的写函数的类数据成员。qobject派生类的所有属性都可以从QML访问。

例如,下面是一个具有作者属性的Message类。正如Q_PROPERTY宏调用所指定的那样,这个属性通过author()方法可读,通过setAuthor()方法可写:

class Message : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
public:
    void setAuthor(const QString &a) {
        if (a != m_author) {
            m_author = a;
            emit authorChanged();
        }
    }
    QString author() const {
        return m_author;
    }
signals:
    void authorChanged();
private:
    QString m_author;
};

如果在加载名为MyItem的文件时将该类的一个实例设置为上下文属性。从c++) qml:

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQuickView view;
    Message msg;
    view.engine()->rootContext()->setContextProperty("msg", &msg);
    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
    view.show();

    return app.exec();
}</

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Meta.Qing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值