将一个 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<MyClass>("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 中使用它,

希望能帮助你更好地理解和使用这一功能。

相关推荐
卷无止境1 天前
C++ 的Eigen 库全解析
c++
卷无止境1 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴1 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18003 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴3 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨4 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint4568 天前
C++进阶(1)——前景提要
c++
夜悊8 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴8 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0019 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp