当前位置: 首页 > news >正文

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

在Qt框架中,对象单例(Singleton)和单类型(Single-instance types)是两种不同的设计模式,它们都用于确保某个类只有一个实例,但是应用场景和实现方式有所不同。

类对象单例(Singleton)

类对象单例是一种常见设计模式,在这种模式下,一个类全局仅有一个实例,这对于管理全局状态和资源访问控制是十分有用的。在Qt中,单例模式可以通过多种方式实现,比如使用 QSingleton 模式或者自定义单例实现,通常涉及以下几个核心步骤:

  1. 构造函数私有化: 确保只有类自己可以创建自己的实例。
  2. 提供一个静态方法: 通常是 instance() 方法,用于获取类的唯一实例。
  3. 静态实例: 在类内部保存唯一实例的静态引用,并在第一次调用 instance() 方法时创建。
  4. 拷贝构造和赋值操作禁止: 防止通过这些方式创建额外的实例。

示例代码如下:

class SingletonClass
{
public:static SingletonClass& instance(){static SingletonClass instance;return instance;}private:SingletonClass() {} // 私有化构造函数// 禁止拷贝和赋值SingletonClass(SingletonClass const&) = delete;void operator=(SingletonClass const&) = delete;
};
 
 

在这个例子中,SingletonClass 使用一个静态方法 instance() 来返回一个静态局部变量的引用,它保证了线程安全并且只会在第一次调用 instance() 时才会创建实例。

单类型(Single-instance types)

在Qt Quick中,有一种模式被称为“单类型”,它通常用于将一个C++对象暴露给QML,而保证在QML环境中全局只会使用这一个实例。单类型不一定要求C++端的对象是一个单例,但确保了QML端只能访问同一对象实例。

可以通过 qmlRegisterSingletonType<T>() 函数注册一个单类型:

qmlRegisterSingletonType<MySingleton>("MyModule", 1, 0, "MySingleton",[](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {Q_UNUSED(engine)Q_UNUSED(scriptEngine)return new MySingleton();});
 
 

在这个例子中,我们通过提供一个工厂函数来创建 MySingleton 类的实例,并通过 qmlRegisterSingletonType 函数将这个实例注册为QML中的全局单例,该实例可以在QML文件中被访问。

区别与选择

类对象单例的主要目的是确保在整个应用程序的生命周期中,某个类只有一个实例。这适用于那些需要严格控制实例创建,并管理全局状态的场景。

单类型在Qt Quick应用程序中主要用于将C++后端的代码以单一实例的形式暴露给QML前端,涉及Qt的QML引擎和脚本引擎。它更多关注于前端访问的一致性,而非后端构造的限制。

在进行开发时,应当根据具体的应用场景和需求来选择使用单例模式或是单类型。如果是全局服务或状态管理,可能需要单例模式;如果是为了使QML环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。

http://www.vanclimg.com/news/433.html

相关文章:

  • 学习笔记:RMAN CATALOG命令手动注册磁带库中的备份片
  • 《构建之法》读后感
  • 达梦增加备份作业 报错-3503 无效的函数参数
  • 读书笔记:Oracle共享池:数据库内存管理的心脏
  • Python类的定义_类和对象的关系_对象的内存模型
  • Python对2028奥运奖牌预测分析:贝叶斯推断、梯度提升机GBM、时间序列、随机森林、二元分类教练效应量化研究
  • 学习笔记:MySQL:Innodb统计信息参数
  • 库卡气体保护焊机器人省气的方法
  • 物联网技术对于农业的运营都起到了哪些作用
  • [07.28学习笔记] Self-attetion Cross-attetion - Luna
  • 【LLM】Transformer各模块PyTorch简单实现Demo
  • 如何在FastAPI中玩转Schema版本管理和灰度发布?
  • C++ Qt开发QUdpSocket网络通信组件
  • fhq-treap学习笔记
  • 7/28
  • Bruce Momjian 深圳 meetup 回顾
  • 贪心
  • sqlite3 本地数据库可视化工具
  • [题解] P5743 【深基7.习8】猴子吃桃
  • gds 格式文档
  • 微服务学习-02-微服务技术栈整理
  • JUC线程池: ScheduledThreadPoolExecutor详解
  • [题解] P5735 【深基7.例1】距离函数
  • uv命令怎么安装并且让gitlab-runner用户可以执行
  • NRF54L15 TAMPC — Tamper controller 作用介绍
  • 线上故障的排查清单,运维小哥拿走不谢!
  • NRF54L15 AAR作用介绍
  • NRF54L15 CCM功能
  • 恭贺开源之夏 2025 IvorySQL 项目中选学生
  • 自用学习笔记:机器学习入门 速览【第三章】