qmlRegisterSingletonType用于将一个 C++ 类注册为 QML 单例类型

39 篇文章 0 订阅

qmlRegisterSingletonType 是一个函数,用于将一个 C++ 类注册为 QML 单例类型。单例类型在应用中只有一个实例,适用于需要在多个地方共享数据或逻辑的场景。通过注册单例类型,可以将 C++ 对象的功能暴露给 QML 代码,从而在 QML 中使用这些功能。

主要功能

  • 注册 C++ 类为 QML 单例类型:在 QML 中创建一个全局唯一的对象实例。
  • 共享数据和逻辑:在 QML 代码中多个地方共享同一个对象实例。
  • 暴露 C++ 功能给 QML:在 QML 中调用 C++ 类的成员函数和属性。

方法签名

template<typename T>
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, 
                             std::function<QObject*(QQmlEngine*, QJSEngine*)> callback);
  • T: 要注册的 C++ 类。
  • uri: QML 模块的 URI。
  • versionMajor: 模块的主版本号。
  • versionMinor: 模块的次版本号。
  • typeName: 在 QML 中使用的类型名称。
  • callback: 一个返回对象实例的回调函数,传入 QML 引擎和 JS 引擎作为参数。

示例

以下示例展示了如何将一个 C++ 类注册为 QML 单例类型,并在 QML 中使用它。

C++ 类定义

首先,定义一个 C++ 类 MySingleton,并暴露其属性和方法:

#include <QObject>
#include <QDebug>

class MySingleton : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged)
public:
    explicit MySingleton(QObject *parent = nullptr) : QObject(parent), m_message("Hello from C++ Singleton") {}

    QString message() const { return m_message; }
    void setMessage(const QString &message) {
        if (m_message != message) {
            m_message = message;
            emit messageChanged();
        }
    }

signals:
    void messageChanged();

private:
    QString m_message;
};
注册单例类型

main.cpp 中注册 MySingleton 为 QML 单例类型:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QtQml>

#include "MySingleton.h"

static QObject* mySingletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine) {
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    MySingleton *singleton = new MySingleton();
    return singleton;
}

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

    QQmlApplicationEngine engine;

    qmlRegisterSingletonType<MySingleton>("com.example", 1, 0, "MySingleton", mySingletonProvider);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
QML 使用单例类型

main.qml 文件中使用注册的单例类型:

import QtQuick 2.15
import QtQuick.Controls 2.15
import com.example 1.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Singleton Example")

    Column {
        anchors.centerIn: parent
        spacing: 20

        Text {
            text: MySingleton.message
        }

        Button {
            text: "Change Message"
            onClicked: {
                MySingleton.message = "Hello from QML"
            }
        }
    }
}

详细解释

  1. C++ 类定义

    • 定义一个名为 MySingleton 的 C++ 类,继承自 QObject
    • 使用 Q_PROPERTY 宏定义一个名为 message 的属性,并实现其 getter 和 setter 方法。
    • 在 setter 方法中,如果属性值发生变化,则发射 messageChanged 信号。
  2. 注册单例类型

    • main.cpp 中,使用 qmlRegisterSingletonType 注册 MySingleton 类。
    • 提供一个回调函数 mySingletonProvider,用于返回 MySingleton 类的实例。
  3. QML 使用单例类型

    • main.qml 中导入模块 com.example 1.0
    • 通过 MySingleton.message 访问单例对象的属性。
    • 使用按钮点击事件修改单例对象的属性,并在 QML 界面上显示更新后的值。

关键点

  • 模块 URI 和版本:确保在 QML 中导入的模块 URI 和版本与注册时一致。
  • 回调函数:回调函数负责创建并返回单例对象的实例。
  • Q_PROPERTY 宏:使用 Q_PROPERTY 宏将 C++ 类的属性暴露给 QML。

总结

qmlRegisterSingletonType 是一个强大的函数,允许将 C++ 类注册为 QML 单例类型,从而在 QML 中共享同一个对象实例。通过这种方式,可以方便地在 QML 和 C++ 之间共享数据和逻辑,提高应用程序的模块化和可维护性。上述示例展示了如何定义 C++ 类、注册单例类型并在 QML 中使用它,希望能帮助你更好地理解和使用这一功能。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Respect@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值