• Qt注册类对象单例与单类型区别


    1.实现类型SingletonTypeExample

    1. #ifndef SINGLETONTYPEEXAMPLE_H
    2. #define SINGLETONTYPEEXAMPLE_H
    3. #include
    4. class SingletonTypeExample : public QObject
    5. {
    6. Q_OBJECT
    7. public:
    8. //只能显示构造类对象
    9. explicit SingletonTypeExample(QObject *parent = nullptr);
    10. //属性
    11. Q_PROPERTY (int someProperty
    12. READ someProperty //读取属性值
    13. WRITE setSomeProperty //设置属性值
    14. NOTIFY somePropertyChanged) //属性值变更通知
    15. public:
    16. //析构
    17. ~SingletonTypeExample(){};
    18. //QML前端可直接调用方法
    19. Q_INVOKABLE int doSomething() {
    20. setSomeProperty(5);
    21. return m_someProperty;
    22. }
    23. //获取属性值
    24. int someProperty() const {
    25. return m_someProperty;
    26. }
    27. //设置属性值
    28. void setSomeProperty(int val) {
    29. m_someProperty = val;//属性值
    30. emit somePropertyChanged(val);//发射属性变更信号
    31. }
    32. signals:
    33. void somePropertyChanged(int newValue);//属性变更信号声明
    34. private:
    35. int m_someProperty;//私有属性值
    36. };
    37. #endif // SINGLETONTYPEEXAMPLE_H
    1. #include "singletontypeexample.h"
    2. //构造实现
    3. SingletonTypeExample::SingletonTypeExample(QObject *parent)
    4. : QObject{parent}, m_someProperty(0) //初始化属性变量
    5. {
    6. }

     2.创建类对象静态实例,已为下面注册用

    1. //注册类对象为单类型
    2. static QObject *QObjectSingletonTypeProvider(QQmlEngine *engine, QJSEngine *scriptEngine){
    3. Q_UNUSED(engine)
    4. Q_UNUSED(scriptEngine)
    5. SingletonTypeExample *st = new SingletonTypeExample();//实例化类对象并返回该对象
    6. return st;
    7. }

    因为注册函数要求包含QQmlEngine *engine, QJSEngine *scriptEngine这两个参数  

     

    3.注册单类型 

    1. //注册类对象单类型
    2. qmlRegisterSingletonType("Qt.jsApi.QObjectSingleton", 1, 0, "MyApi",QObjectSingletonTypeProvider );

    4.在QML中使用单类型

    上面为注册类对象为单类型使用

    下面演示注册类对象为单例使用

    1.创建类型MySysInfo

    1. #ifndef MYSYSINFO_H
    2. #define MYSYSINFO_H
    3. #include
    4. #include
    5. #include
    6. class MySysInfo : public QObject
    7. {
    8. Q_OBJECT
    9. public:
    10. explicit MySysInfo(QObject *parent = nullptr);
    11. //productType
    12. Q_INVOKABLE QString getSysProductType();
    13. //productVersion
    14. Q_INVOKABLE QString getSysProductVersion();
    15. //currentCpuArchitecture
    16. Q_INVOKABLE QString getSysCurrentCpuArchitecture();
    17. signals:
    18. };
    19. #endif // MYSYSINFO_H

     

    1. #include "mysysinfo.h"
    2. MySysInfo::MySysInfo(QObject *parent)
    3. : QObject{parent}
    4. {
    5. }
    6. QString MySysInfo::getSysProductType()
    7. {
    8. return QString( QSysInfo::productType().toStdString().c_str());
    9. }
    10. QString MySysInfo::getSysProductVersion()
    11. {
    12. return QSysInfo::productVersion();
    13. }
    14. QString MySysInfo::getSysCurrentCpuArchitecture()
    15. {
    16. return QSysInfo::currentCpuArchitecture();
    17. }

    2.注册MySysInfo为单例

    1. //注册单例
    2. MySysInfo *_info = new MySysInfo();
    3. qmlRegisterSingletonInstance("App.SysInfo",1,0,"SysInfo",_info);

    3.在QML中使用单例

    上面为注册C++类对象为单类型与单例使用

    下面注册JS单例并使用

    1.创建JS静态单类型

    1. //首先,定义单类型提供函数(回调).
    2. static QJSValue jsSingleTypeProvider(QQmlEngine *engine, QJSEngine *jsEngine){
    3. Q_UNUSED(engine)
    4. static int val = 5;
    5. QJSValue singleType = jsEngine->newObject();
    6. singleType.setProperty("propertyOfSingleType", val++);
    7. return singleType;
    8. }

    JS注册单类型函数要求提供一个包含QQmlEngine *engine, QJSEngine *jsEngine这两个参数 并返回QJSValue类型的静态对象 

     

     2.注册JS单类型

    1. //其次,注册js单例函数给qml调用
    2. qmlRegisterSingletonType("Qt.jsApi", 1, 0, "JsApi", jsSingleTypeProvider);

    3.在QML中使用JS注册单类型

    4.直接使用Lambda注册JS单类型

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

     5.在QML中使用

  • 相关阅读:
    【无标题】verilog-hdl-farmat属于FPGA工程师的Verilog实用开发插件
    Redis分布式锁——秒杀超卖
    关系型数据库RDS基本简介
    Aspose.Words使用教程之从零创建OOXML图表
    每个开发人员都应该关注的7个优秀的GitHub仓库
    HTML5期末大作业:美食网页主题网站设计与实现——HTML+CSS+JavaScript月饼美食食品企业网站html模板9页面
    NLP - 使用 transformers 翻译
    一文整理深度学习【深度学习linux的docker+pytorch+cuda+nvidia-docker+vscode配置】
    快速创建django项目管理系统流程
    SORT追踪
  • 原文地址:https://blog.csdn.net/fittec/article/details/136380149