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

相关推荐
new_zhou几秒前
vs2019+qt工程中生成dump文件及调试
开发语言·qt·visual studio·dump调试
栈与堆25 分钟前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦27 分钟前
03-01:MQ常见问题梳理
java·开发语言
txinyu的博客31 分钟前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
hugerat37 分钟前
在AI的帮助下,用C++构造微型http server
linux·c++·人工智能·http·嵌入式·嵌入式linux
阿里嘎多学长39 分钟前
2026-01-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
yuanyikangkang40 分钟前
STM32 lin控制盒
开发语言
-森屿安年-42 分钟前
unordered_map 和 unordered_set 的实现
数据结构·c++·散列表
九久。1 小时前
手动实现std:iterator/std:string/std::vector/std::list/std::map/std:set
c++·stl