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

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 中使用它,希望能帮助你更好地理解和使用这一功能。

相关推荐

  1. C++ 模式

    2024-07-14 21:14:02       31 阅读
  2. C++8-2】 目运算符“++”重载成员函数

    2024-07-14 21:14:02       25 阅读
  3. C++特殊设计(模式)

    2024-07-14 21:14:02       45 阅读
  4. C++】特殊 | 模式

    2024-07-14 21:14:02       49 阅读
  5. C其他类型转换字符类型

    2024-07-14 21:14:02       32 阅读
  6. C++】特殊设计及模式

    2024-07-14 21:14:02       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 21:14:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 21:14:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 21:14:02       58 阅读
  4. Python语言-面向对象

    2024-07-14 21:14:02       69 阅读

热门阅读

  1. 关于RiboSeq分析流程的总结

    2024-07-14 21:14:02       20 阅读
  2. T113-i 高清倒车支持解串器MAX96708驱动

    2024-07-14 21:14:02       21 阅读
  3. 【MySQL】9.表的内外连接

    2024-07-14 21:14:02       20 阅读
  4. 代码随想三刷图论篇1

    2024-07-14 21:14:02       17 阅读
  5. redux & react-redux结合使用 2024

    2024-07-14 21:14:02       21 阅读
  6. python热门面试题三

    2024-07-14 21:14:02       23 阅读
  7. C++字符串String和字符串字面量String Literals

    2024-07-14 21:14:02       21 阅读
  8. .NET MAUI开源架构_3..NET MAUI 提供的内容

    2024-07-14 21:14:02       23 阅读
  9. .NET MAUI开源架构_4..NET MAUI 应用支持的平台

    2024-07-14 21:14:02       19 阅读
  10. Spring 事务管理配置方法

    2024-07-14 21:14:02       22 阅读
  11. ISA95-Part5-安全和权限管理的设计思路

    2024-07-14 21:14:02       23 阅读