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

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

相关推荐
wabs666几秒前
关于栈【力扣150.逆波兰表达式求值的思考】
数据结构·c++·算法·leetcode··代码随想录
欧特克_Glodon8 分钟前
OpenCV计算机视觉开发入门与实践<十七>:点运算与灰度变换概述
c++·人工智能·opencv·计算机视觉
牛油果子哥q12 分钟前
C++序列式容器深度精讲:vector/list/deque底层实现、扩容原理、迭代器失效、性能对比、工程选型避坑
开发语言·c++·list
啦啦啦啦啦zzzz17 分钟前
升序链表的定时器
linux·服务器·网络·数据结构·c++·链表
WBluuue18 分钟前
数据结构与算法:带权并查集
数据结构·c++·算法
渡我白衣25 分钟前
Acceptor模块的设计与实现
java·linux·服务器·开发语言·网络·c++·人工智能
程序员AlbertTu34 分钟前
M01 | 浮点数与误差:数值计算的世界观
c++·数值运算
沫璃染墨38 分钟前
《从零入门Linux系统篇(二十八):文件篇·一——Linux为什么“万物皆文件”:从C语言文件流到系统调用》
linux·运维·服务器·开发语言·c++·文件
j7~2 小时前
【C++】《C++STL 笔记:搞懂序列 / 关联容器,聊聊 set 和 map》
c++·set·map·multimap·multiset·键值对pair·序列是容器和关联式容器
luteres2 小时前
Mybatis+SSM整合笔记
java·开发语言·mybatis