1.实现类型SingletonTypeExample
- #ifndef SINGLETONTYPEEXAMPLE_H
- #define SINGLETONTYPEEXAMPLE_H
-
- #include
-
- class SingletonTypeExample : public QObject
- {
- Q_OBJECT
- public:
- //只能显示构造类对象
- explicit SingletonTypeExample(QObject *parent = nullptr);
- //属性
- Q_PROPERTY (int someProperty
- READ someProperty //读取属性值
- WRITE setSomeProperty //设置属性值
- NOTIFY somePropertyChanged) //属性值变更通知
-
- public:
- //析构
- ~SingletonTypeExample(){};
- //QML前端可直接调用方法
- Q_INVOKABLE int doSomething() {
- setSomeProperty(5);
- return m_someProperty;
- }
- //获取属性值
- int someProperty() const {
- return m_someProperty;
- }
- //设置属性值
- void setSomeProperty(int val) {
- m_someProperty = val;//属性值
- emit somePropertyChanged(val);//发射属性变更信号
- }
-
- signals:
- void somePropertyChanged(int newValue);//属性变更信号声明
-
- private:
- int m_someProperty;//私有属性值
- };
-
- #endif // SINGLETONTYPEEXAMPLE_H
- #include "singletontypeexample.h"
- //构造实现
- SingletonTypeExample::SingletonTypeExample(QObject *parent)
- : QObject{parent}, m_someProperty(0) //初始化属性变量
- {
-
- }
2.创建类对象静态实例,已为下面注册用
- //注册类对象为单类型
- static QObject *QObjectSingletonTypeProvider(QQmlEngine *engine, QJSEngine *scriptEngine){
- Q_UNUSED(engine)
- Q_UNUSED(scriptEngine)
- SingletonTypeExample *st = new SingletonTypeExample();//实例化类对象并返回该对象
- return st;
- }
因为注册函数要求包含QQmlEngine *engine, QJSEngine *scriptEngine这两个参数
3.注册单类型
- //注册类对象单类型
- qmlRegisterSingletonType
("Qt.jsApi.QObjectSingleton", 1, 0, "MyApi",QObjectSingletonTypeProvider );
4.在QML中使用单类型

上面为注册类对象为单类型使用
下面演示注册类对象为单例使用
1.创建类型MySysInfo
- #ifndef MYSYSINFO_H
- #define MYSYSINFO_H
-
- #include
- #include
- #include
-
- class MySysInfo : public QObject
- {
- Q_OBJECT
- public:
- explicit MySysInfo(QObject *parent = nullptr);
- //productType
- Q_INVOKABLE QString getSysProductType();
- //productVersion
- Q_INVOKABLE QString getSysProductVersion();
- //currentCpuArchitecture
- Q_INVOKABLE QString getSysCurrentCpuArchitecture();
- signals:
-
- };
-
- #endif // MYSYSINFO_H
- #include "mysysinfo.h"
-
- MySysInfo::MySysInfo(QObject *parent)
- : QObject{parent}
- {
-
- }
-
- QString MySysInfo::getSysProductType()
- {
- return QString( QSysInfo::productType().toStdString().c_str());
- }
-
- QString MySysInfo::getSysProductVersion()
- {
- return QSysInfo::productVersion();
- }
-
- QString MySysInfo::getSysCurrentCpuArchitecture()
- {
- return QSysInfo::currentCpuArchitecture();
- }
2.注册MySysInfo为单例
- //注册单例
- MySysInfo *_info = new MySysInfo();
- qmlRegisterSingletonInstance
("App.SysInfo",1,0,"SysInfo",_info);
3.在QML中使用单例

上面为注册C++类对象为单类型与单例使用
下面注册JS单例并使用
1.创建JS静态单类型
- //首先,定义单类型提供函数(回调).
- static QJSValue jsSingleTypeProvider(QQmlEngine *engine, QJSEngine *jsEngine){
- Q_UNUSED(engine)
-
- static int val = 5;
- QJSValue singleType = jsEngine->newObject();
- singleType.setProperty("propertyOfSingleType", val++);
- return singleType;
- }
JS注册单类型函数要求提供一个包含QQmlEngine *engine, QJSEngine *jsEngine这两个参数 并返回QJSValue类型的静态对象
2.注册JS单类型
- //其次,注册js单例函数给qml调用
- qmlRegisterSingletonType("Qt.jsApi", 1, 0, "JsApi", jsSingleTypeProvider);
3.在QML中使用JS注册单类型

4.直接使用Lambda注册JS单类型
- //直接使用Lambda表达式注册
- qmlRegisterSingletonType("Qt.jsApi.Ext", 1, 0, "JsApiExt", [](QQmlEngine *engine, QJSEngine *jsEngine) -> QJSValue {
- Q_UNUSED(engine)
- static QString strVal = "HelloWorld";
- QJSValue obj = jsEngine->newObject();
- obj.setProperty("propertyOfJsApiWithString", strVal);
- return obj;
- });
5.在QML中使用
