1.實現類型SingletonTypeExample
#ifndef SINGLETONTYPEEXAMPLE_H
#define SINGLETONTYPEEXAMPLE_H#include <QObject>class SingletonTypeExample : public QObject
{Q_OBJECT
public://只能顯示構造類對象explicit SingletonTypeExample(QObject *parent = nullptr);//屬性Q_PROPERTY (int somePropertyREAD 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<SingletonTypeExample>("Qt.jsApi.QObjectSingleton", 1, 0, "MyApi",QObjectSingletonTypeProvider );
4.在QML中使用單類型
上面為注冊類對象為單類型使用
下面演示注冊類對象為單例使用
1.創建類型MySysInfo
#ifndef MYSYSINFO_H
#define MYSYSINFO_H#include <QObject>
#include <QQuickItem>
#include <QSysInfo>class MySysInfo : public QObject
{Q_OBJECT
public:explicit MySysInfo(QObject *parent = nullptr);//productTypeQ_INVOKABLE QString getSysProductType();//productVersionQ_INVOKABLE QString getSysProductVersion();//currentCpuArchitectureQ_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<MySysInfo>("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中使用