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

一.单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

单例模式的作用和特性如下:

全局唯一实例:

确保系统中某个类只有一个实例,避免多个实例导致的资源消耗和数据不一致问题。

资源控制:

控制对共享资源的访问,比如数据库连接池、线程池等,避免频繁创建和销毁对象。

状态管理:

用于管理全局状态,如配置信息、计数器、日志记录器等。

二.将一个 C++ 类注册为 QML 单例类型

1.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 引擎作为参数。

2.代码示例

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

(1)C++ 类定义

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

#include <QDebug>

#include <QObject>

class MyClass : public QObject

{

Q_OBJECT

Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)

public:

MyClass(QObject *parent = nullptr) : QObject(parent), m_value(0) {}

int getValue() const {

qDebug()<<"MyClass--------getValue-----:"<<m_value;

return m_value;

}

void setValue(int value) {

if (m_value != value) {

m_value = value;

qDebug()<<"MyClass--------setValue-----:"<<m_value;

emit valueChanged(m_value);

}

}

signals:

void valueChanged(int newValue);

private:

int m_value;

};

(2)注册单例类型

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

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

Q_UNUSED(engine)

Q_UNUSED(scriptEngine)

MyClass *singleton = new MyClass();

return singleton;

}

int main(int argc, char *argv[])

{

set_qt_environment();

QGuiApplication app(argc, argv);

qmlRegisterSingletonType<MyClass>("MyLibrary", 1, 0, "MyClass", mySingletonProvider);

QQmlApplicationEngine engine;

const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);

QObject::connect(

&engine,

&QQmlApplicationEngine::objectCreated,

&app,

url\](QObject \*obj, const QUrl \&objUrl) { if (!obj \&\& url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml"); engine.addImportPath(":/"); engine.load(url); if (engine.rootObjects().isEmpty()) { return -1; } return app.exec(); } 注册语句: qmlRegisterSingletonType\("MyLibrary", 1, 0, "MyClass", mySingletonProvider); ****(3)QML 使用单例类型**** 在 main.qml 文件中使用注册的单例类型: import QtQuick 6.0 import QtQuick.Controls 6.0 import NetLibrary 1.0 import MyLibrary 1.0 ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("QML Button Example") Column { id: buttonRow anchors.fill: parent spacing: 20 // MyClass{ //这个语句不需要了,因为是单例模式,不再需要实例化,直接用类名引用即可 // id:myClass // } Button { id: button1 text: qsTr("button1") onClicked: { console.log("Button clicked12!") console.log("myClass.value33:",MyClass.value) //直接用类名引用变量 MyClass.value=2 button1.text = qsTr("Clicked1!") } } } } ****注意:**** //这个语句不需要了,因为是单例模式,不再需要实例化,直接用类名引用即可 // MyClass{ // id:myClass // } //单例模式直接用类名引用变量即可 console.log("myClass.value33:",MyClass.value) MyClass.value=2 ****3.总结**** qmlRegisterSingletonType 是一个强大的函数,允许将 C++ 类注册为 QML 单例类型,从而在 QML 中共享同一个对象实例。 通过这种方式,可以方便地在 QML 和 C++ 之间共享数据和逻辑,提高应用程序的模块化和可维护性。上述示例展示了如何定义 C++ 类、注册单例类型并在 QML 中使用它, 希望能帮助你更好地理解和使用这一功能。

相关推荐
二进制coder7 分钟前
C++ 中的 Interface:概念、实现与应用详解
开发语言·c++
古城小栈8 分钟前
Go 与 Rust:系统编程语言的竞争与融合
开发语言·golang·rust
随风一样自由9 分钟前
React编码时,什么时候用js文件,什么时候用jsx文件?
开发语言·javascript·react.js
by__csdn13 分钟前
Vue3 生命周期全面解析:从创建到销毁的完整指南
开发语言·前端·javascript·vue.js·typescript·前端框架·ecmascript
小年糕是糕手13 分钟前
【C++同步练习】模板初阶
服务器·开发语言·前端·javascript·数据库·c++·改行学it
永远不打烊19 分钟前
c++11 之 智能指针
c++
weixin_3077791319 分钟前
Jenkins Folders插件详解:组织、管理与最佳实践
运维·开发语言·自动化·jenkins
raoxiaoya21 分钟前
golang调用 elasticsearch 8,向量检索
开发语言·elasticsearch·golang
deng-c-f23 分钟前
C/C++内置库函数(2):智能指针
java·c语言·c++
yuhaiqun198923 分钟前
新手练 C++ HTTP 服务实操:从 “拆请求头” 到 “发 HTML 响应”
c语言·c++·程序人生·http·html·学习方法·改行学it