博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ Qt 元对象系统笔记
阅读量:3966 次
发布时间:2019-05-24

本文共 1393 字,大约阅读时间需要 4 分钟。

c++ Qt 元对象系统笔记

元对象

元对象系统是一个基于标准C++的扩展,为Qt提供了信号与槽机制、实时类型信息、动态属性系统。

元对象系统的三个基本条件:

1.类必须继承自QObject

2.类声明Q_OBJECT宏(默认私有有)

3.元对象编译器moc。

信号与槽机制与moc编译器

信号和槽机制是 QT 的核心机制,信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,信号和槽是QT自行定义的一种通信机制,它独立于标准的 C/C++ 语言,要正确的处理信号和槽,必须借助一个称为 moc(Meta-Object Compiler),也就是“元对象编译器”。,它为高层次的事件处理自动生成所需要的必要代码。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果moc发现在一个类头文件中包含了宏 Q_OBJECT,则会生成以moc_className.cpp(自定义类名)的.cpp文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。新的文件同样将进入编译系统,与原文件一起参与编译。构建生成的.o文件包含moc生成的cpp文件。

QObject类

QObject类是所有Qt对象的基类

QObject类的方法:

在这里插入图片描述

connect()方法,信号与槽连接的方法

disconnect() ,断开信号与槽连接

Chlidren() 返回它的所有子类 返回类型是一个链表

parent() 方法 是返回这个类的父类

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

QObject之所以为元对象系统的基类,因其提供了元对象系统很多支持工作:

信号与槽、事件处理、属性设置、国际化支持(翻译)、对象树资源管理等等。

使用QObject作为基类而不使用Q_OBJECT宏和元对象代码是可以的,但是如果Q_OBJECT宏没有被使用,那么这个类声明的信号和槽,以及其他特征描述都不会被调用。

Q_OBJECT 宏

在这里插入图片描述

Q_OBJECT 宏 除去一些 编译信息都是在操作QMetaObject 元对象类

鼠标放在QMetaObject 按住Ctrl右击进入QMetaObject类中看一下;

QMetaObject 元对象类

在这里插入图片描述

在这里插入图片描述

总结:

元对象系统除实现信号与槽外,还有很多其他特性,比如:

QObject::metaObject()返回与该类绑定的meta-object对象。

QMetaObject::className()可以在运行时以字符串的形式返回类的名字,不需要C++编译器原生的运行时类型信息(RTTI)的支持。

QObject::inherits()函数返回继承信息:对象是否是QObject继承树上一个类的实例。

QObject::tr()和QObject::trUtf8()提供国际化支持,将字符串翻译成指定的语言。

QObject::setProperty()和QObject::property()通过名字动态设置和获取对象属性。

QMetaObject::newInstance()构造该类的一个新实例。

​ qObject_cast()动态类型转换。

态设置和获取对象属性。

QMetaObject::newInstance()构造该类的一个新实例。

​ qObject_cast()动态类型转换。

一般建议在QObject的所有子类中使用Q_OBJECT宏,而不管它们是否使用了信号与槽。

转载地址:http://sdyki.baihongyu.com/

你可能感兴趣的文章
动态规划(三)背包问题、回文串分割(Palindrome Partitioning)、编辑距离(Edit Distance)、不同子序列(Distinct Subsequences)
查看>>
Java~在使用isAlive时, 将线程对象已构造参数的形式传递给Thread对象时进行start启动时, 使用this和Thread.currentThread的差异
查看>>
Java~使用synchronized修饰静态方法带来的问题 与 同步synchronized代码块不使用String作为锁对象的原因
查看>>
Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法
查看>>
Java~并发容器ConcurrentHashMap、ConcurrentLinkedQueue、阻塞队列BlockingQueue的实现原理与使用
查看>>
Java~并发流程控制的手段CountDownLatch、CyclicBarrier、Semaphore和Exchanger工具类的学习和使用
查看>>
Java~学习Executor框架, 了解ThreadPoolExecutor和ScheduledThreadPoolExecutor
查看>>
Java~在maven项目中添加junit依赖实现单元测试(@After、@Before 、@Ignore、@Test)的使用
查看>>
selenium~使用unittest测试框架,批量执行测试脚本,addTest、makeSuite、TestLoader、discover的使用
查看>>
Spring~Bean的作用域(单例模式、原型模式)等, Bean的自动装配方法, @AutoWired和@Resource的区别
查看>>
Spring~使用注解配置开发(@Component、@Repository、@Service、@Controller)和使用JavaConfig实现配置开发
查看>>
Spring~使用Mybatis-Spring包将MyBatis与Spring整合(俩种方式实现), 解决静态资源不导入问题
查看>>
MyBatis~配置解析, 属性(properties)、设置(settings)、类型别名(typeAliases)、环境配置(environments)、映射器(mappers)
查看>>
MyBatis~使用万能的ResultMap解决属性名和字段名不一致问题,实现分页查询 | 使用注解实现简单的CRUD(注意@Param的使用)
查看>>
MyBatis~关联的嵌套Select查询和关联的嵌套结果映射(association元素的使用)、集合的嵌套Select查询和集合的嵌套结果映射(collection的使用)
查看>>
MyBatis~动态 SQL之if,choose、when、otherwise,trim、where、set,foreach,sql的使用,实现带逻辑代码的sql语句
查看>>
SpringMVC~使用RestFul风格和SpringMVC俩种方式接收数据, 对比model、modelMap、modelAndView三种方式数据显示到前端
查看>>
SpringBoot~解决三个疑惑,为什么pom.xml文件中导入依赖不需要版本? 它是如何实现自动配置的? 它是如何启动运行的?
查看>>
SpringBoot~使用javaConfig的形式扩展WebMvcConfigurer配置, 实现自定义拦截器、默认转发、自定义视图解析器
查看>>
Java~HashMap1.7与1.8对比, ConcurrentHashMap 1.7和1.8对比, concurrent包下安全集合类的对比
查看>>