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

news2024/9/20 18:32:14

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    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<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);
    //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<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中使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1480566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

普通索引和唯一索引详解

前言 面试的时候有时会问面试者&#xff0c;普通索引和唯一索引有什么区别。很多人&#xff0c;甚至工作很多年的工程师回答的千篇一律 “普通索引可以有重复的值&#xff0c;唯一索引不能有重复的值”。于是我又问&#xff0c;这两个索引这两个索引效率哪个高&#xff0c;很少…

springboot231基于SpringBoot+Vue的乡政府管理系统

乡政府管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装乡政府管理系统软件来发挥其高效…

植物神经紊乱和焦虑症是一样吗?教你认清这两种疾病

植物神经紊乱和焦虑症并非同一种疾病&#xff0c;尽管它们在一些方面可能有相似的症状&#xff0c;但在病理生理过程、诊断标准和治疗方法上存在明显的区别。患者和家属需要更深入地了解这两种疾病&#xff0c;以便进行正确的诊断和治疗。 植物神经紊乱是一种自主神经功能紊乱的…

python模型训练

目录 1、新建模型 train_model.py 2、运行模型 &#xff08;1&#xff09;首先会下载data文件库 &#xff08;2&#xff09;完成之后会开始训练模型&#xff08;10次&#xff09; 3、 训练好之后&#xff0c;进入命令集 4、输入命令&#xff1a;python -m tensorboard.ma…

MWC 2024:华为手机展现科技创新实力,持续强化高端科技品牌形象

虽然天气有些清冷&#xff0c;但今年的巴塞罗那街头却人潮涌动&#xff0c;从2月26号开始&#xff0c;这个位于伊比利亚半岛东北部&#xff0c;濒临地中海的世界著名历史文化名城将迎来一年一度的全球移动盛会。 作为全球通信领域最具规模和影响的展会&#xff0c;MWC&#xf…

2024最新精华版Java面试题之spring篇

目录 一、Java面试题之spring篇 1、什么是spring? 2、你们项目中为什么使用Spring框架&#xff1f; 3、 Autowired和Resource关键字的区别&#xff1f; 4、依赖注入的方式有几种&#xff0c;各是什么? 5、讲一下什么是Spring容器&#xff1f; 6、说说你对Spring MVC的理…

智慧治水丨计讯物联水利RTU助推小型水库出险加固工程建设与管理

日前&#xff0c;水利部印发《关于健全小型水库除险加固和运行管护机制的意见》&#xff08;以下简称《意见》&#xff09;&#xff0c;健全小型水库除险加固和运行管护常态化机制&#xff0c;提高小型水库安全管理水平。《意见》提出了“十四五”的两大管理机制&#xff0c;通…

TSINGSEE青犀AI智能分析网关V4工业园区/厂区/工厂智慧安监方案

一、背景与需求分析 随着科技的不断发展&#xff0c;传统的安全监管方式已经难以满足现代工业园区的安全需求。为了提高工业园区的安全监管水平&#xff0c;智慧安监方案成为了新的选择。针对工业园区化工企业多且安全及环保等方面存在风险高、隐患多、精细化管控复杂的情况&a…

Linux - 权限概念

Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在linux下做有限的事情超级用户的命令提示符是“#”&#xff0c;普通用户的命令提示符是“$” 命…

shell 免交互ecxept样例

语法 expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ] 选项 -c&#xff1a;从命令行执行expect脚本&#xff0c;默认expect是交互地执行的 示例&#xff1a;expect -c expect "\n" {send "pressed enter\n"} -d&#xff1a;输出调试信息 …

2024全国水科技大会暨新能源及电子行业废水论坛(十一)

一、会议背景 为深入学习贯彻《中共中央、国务院关于全面推进美丽中国建设的意见》&#xff0c;全面贯彻实施《固体废物污染环境防治法》、《“十四五”全国城市基础设施建设规划》&#xff0c;推进我国污泥处理工程建设&#xff0c;提高处理产物资源化利用水平&#xff0c;促进…

YOLOv9详细解读,改进提升全面分析(附YOLOv9结构图)

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 1. 概要1.1 模型结构上的改动:1.2 训练脚本上的改动&#xff1a; 2. 介绍2.1 背景2.2 主要贡献 3. 总体框架3.1 可编程梯度信息&#xff08;PGI&#xff09;3.1.1 辅助可逆分支3.1.2 多级辅助信息 3.2 Ge…

【UE 材质】制作加载图案(2)

在上一篇&#xff08;【UE 材质】制作加载图案&#xff09;基础上继续实现如下效果的加载图案 效果 步骤 1. 复制一份上一篇制作的材质并打开 2. 添加“Floor”节点向下取整 除相同的平铺数 此时的效果如下 删除如下节点 通过“Ceil”向上取整&#xff0c;参数“Tiling”默认…

苹果iOS群控系统开发常见功能及其代码解析!

随着移动互联网的快速发展&#xff0c;iOS设备因其良好的用户体验和丰富的应用生态&#xff0c;受到了广大用户的喜爱&#xff0c;苹果iOS群控系统&#xff0c;即可以同时对多台iOS设备进行集中控制和管理的系统&#xff0c;逐渐成为了开发者、测试人员以及企业管理的有力工具。…

基于PHP的在线英语学习平台

有需要请加文章底部Q哦 可远程调试 基于PHP的在线英语学习平台 一 介绍 此在线英语学习平台基于原生PHP开发&#xff0c;数据库mysql。系统角色分为学生&#xff0c;教师和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/…

Spring Exception 常见错误

今天&#xff0c;来学习 Spring 的异常处理机制。Spring 提供了一套健全的异常处理框架&#xff0c;以便我们在开发应用的时候对异常进行处理。但是&#xff0c;我们也会在使用的时候遇到一些麻烦&#xff0c;接下来我将通过两个典型的错误案例&#xff0c;带着你结合源码进行深…

Centos7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

Android ANR 日志分析定位

ANR 是 Android 应用程序中的 "Application Not Responding" 的缩写&#xff0c;中文意思是 "应用程序无响应"。这是当应用程序在 Android 系统上运行时&#xff0c;由于某种原因不能及时响应用户输入事件或执行一个操作&#xff0c;导致界面无法更新&…

NodeJs 版本升级时Vue工程报错

最近把nodejs 的版本更新了&#xff0c;原来用的 16.15.1 现在用的 18.16.1&#xff0c;结果所有的vue工程都启不动了&#xff0c;一直报错。 1.报错截图 2.原因分析 error:03000086:digital envelope routines::initialization error &#xff0c;这个是nodejs版本的问题&am…

Linux基础指令(任务调度、磁盘分区挂载、网络配置、进程管理)

Linux基础指令 1、任务调度简介基本语法crontab【选项】at定时任务 2、磁盘分区、挂载3、网络配置配置网络环境设置主机名和host映射主机名解析过程分析 4、进程管理ps指令终止进程查看进程树服务管理打开或关闭指定端口动态监控进程&#xff08;top&#xff09;监控网络状态 1…