Qt扫盲-Qt QObject模型概述

news/2024/11/7 14:41:30/

Qt QObject模型概述

  • 一、概述
  • 二、 Qt Object Model 类
  • 三、Qt对象: Identities vs Value

一、概述

标准的c++对象模型为对象范式提供了非常高效的运行时支持。但它的静态特性在某些问题领域是不灵活的。图形用户界面编程是一个既需要运行时效率又需要高度灵活性的领域。Qt通过结合c++的速度和Qt对象模型的灵活性提供了这一点。
Qt为c++添加了以下特性。

  • 一种非常强大的无缝对象通信机制,称为信号槽
  • 可查询和可设计的对象属性
  • 强大的事件和事件过滤器
  • 用于国际化的上下文字符串翻译
  • 复杂的间隔驱动定时器,使在事件驱动的GUI中优雅地集成许多任务成为可能
  • 层次化和可查询的对象树,以自然的方式组织对象所有权
  • 当被引用的对象被销毁时,保护指针(QPointer)自动设置为0,不像普通的c++指针在其对象被销毁时成为悬空指针
    跨库边界工作的动态类型转换。
  • 支持自定义类型创建。

Qt的许多特性都是基于QObject的继承,用标准c++技术实现的。其他的,如对象通信机制和动态属性系统,则需要Qt自己的元对象编译器(Meta-Object Compiler, moc)提供的元对象系统。
元对象系统是一个c++扩展,它使语言更适合于真正的组件GUI编程。

二、 Qt Object Model 类

Qt 支持的常用的 对象模型的 类

含义
QMetaClassInfo关于类的附加信息
QMetaEnum关于枚举器的元数据
QMetaMethod关于成员函数的元数据
QMetaObject包含有关Qt对象的元信息
QMetaProperty关于属性的元数据
QMetaType管理元对象系统中的命名类型
QObject所有Qt对象的基类
QObjectCleanupHandler监视多个qobject的生命周期
QPointer模板类,提供了指向QObject的守护指针
QSignalBlocker围绕QObject::blockSignals()的异常安全包装器
QSignalMapper捆绑来自可识别发送者的信号
QVariant类似于最常见Qt数据类型的union

三、Qt对象: Identities vs Value

上面为Qt对象模型列出的一些新增特性要求我们将Qt对象视为 identities,而不是Value。

Value被复制或赋值;identities是克隆的。克隆意味着创建一个新的identities,而不是旧identities的精确复制。

例如,双胞胎有不同的identities。他们可能看起来一模一样,但他们有不同的名字,不同的地点,可能拥有完全不同的社交网络。
那么,克隆标识是一个比复制或赋值更复杂的操作。我们可以在Qt对象模型中看到这意味着什么。

意味着一个Qt对象

  • 可能有一个唯一的QObject::objectName()。如果我们复制一个Qt对象,我们应该给它起什么名字?
  • 在对象层次中有一个位置。如果我们复制一个Qt对象,它应该位于哪里?
  • 可以连接到其他Qt对象,向它们发出信号或接收它们发出的信号。如果我们复制一个Qt对象,我们应该如何将这些连接传输到副本?
  • 可以在运行时添加在c++类中未声明的新属性。如果我们复制一个Qt对象,这个副本应该包含添加到原始对象上的属性吗?

出于这些原因,Qt对象应该被视为Identities ,而不是Value。Identities 是克隆的,而不是复制或赋值的,而且克隆Identities 是比复制或赋值更复杂的操作。因此,QObject和QObject的所有子类(直接或间接)都禁用了复制构造函数和赋值运算符。


http://www.ppmy.cn/news/11485.html

相关文章

java mybatis的SpringBoot博客论坛管理系统

java mybatis的SpringBoot博客论坛管理系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

通讯录的实现(详解)(后附完整源代码)

通讯录的实现一.所需要的功能二.大致菜单三.创建通讯录四.增加联系人五.显示联系人六.查找联系人七.删除联系人八.修改联系人九.按名字排序一.所需要的功能 对于通讯录来说,我们需要它实现以下几个功能。 1.人的信息:姓名年龄性别电话地址。 2.可以存放…

【Linux】信号机制(非实时信号)

目录 前言 一.信号的概念以及产生 1.什么是信号 2.信号分为两类 3.查看信号的命令 4.信号如何产生 1).通过软件产生 2).通过硬件产生 3).通过键盘组合键产生 二.信号的发送以及保存 1.信号如何发送 2.信号如何保存 1).概念 2).底层实现结构&&内核中的实现…

微服务自动化管理【docker compose】

1.什么是docker-compose Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排 通过编写docker-compose文件可对多个服务同时进行启动/停止/更新(可定义依赖,按顺序启动服务) docker-compose将所管理的容器分为3层结构&#…

连接查询入门

1、什么是连接查询? 从一张表中查询数据,称为单表查询。 多张表联合起来查询数据,称为连接查询。在实际开发中一般一个业务会对应多张表,所以连接查询使用较多。 2、连接查询的分类: 根据语法的年代分类:SQL92(1992年出…

行云创新受邀出席2023中国(深圳)阿联酋(迪拜)经贸合作交流会

1月10日,2023中国(深圳)-阿联酋(迪拜)经贸合作交流会成功举办。本次交流会充分展示了深圳和迪拜两地城市营商环境和政策优势,并围绕科技创新、数字经济、港口物流等领域发展经验展开分享,来自两…

从零开始带你实现一套自己的CI/CD(四)Jenkins Pipeline流水线

目录一、简介二、Groovy2.1 HelloWorld2.2 Pipeline script from SCM三、Jenkinsfile3.1 拉取代码3.2 代码质量检测3.3 构建代码3.4 制作镜像并发布镜像仓库3.5 部署到目标服务器3.6 完整的Jenkinsfile3.7 参数配置3.8 通过参数构建四、添加邮件通知4.1 配置Jenkins邮件配置4.2…

CAD转换PDF怎么转换?新手必备的方法

相信很多从事建筑类的相关工作的小伙伴们对CAD文件都并不陌生,在设计图纸和数据更改大都是使用这类文件的专业工具。这类文件的专业性较强设计出来的图纸也比较规范,但就有一个问题比较麻烦,那便是在不同设备打开需要对应的查阅软件&#xff…