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"
}
}
}
}
详细解释
-
C++ 类定义:
- 定义一个名为
MySingleton
的 C++ 类,继承自QObject
。 - 使用
Q_PROPERTY
宏定义一个名为message
的属性,并实现其 getter 和 setter 方法。 - 在 setter 方法中,如果属性值发生变化,则发射
messageChanged
信号。
- 定义一个名为
-
注册单例类型:
- 在
main.cpp
中,使用qmlRegisterSingletonType
注册MySingleton
类。 - 提供一个回调函数
mySingletonProvider
,用于返回MySingleton
类的实例。
- 在
-
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 中使用它,希望能帮助你更好地理解和使用这一功能。