01QT元对象系统

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

一、元对象系统

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

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

1:类必须继承自QObject

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

3:元对象编译器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文件。


Q_OBJECT定义在qobjectdefs.h文件中:

0cb4a22d190d4cd6a37545bbcbe9cedd.png

分析Q_OBJECT后,发现都是在操作元对象,并没有所谓的信号和槽,属性等内容,很显然,QObject对象能够支持这些功能,必然是通过QMetaObject这个元对象来实现的。

QMetaObject定义:元对象类包含的信息

581f2aaacd9e4904a02ce6aa87e380ab.png

581f2aaacd9e4904a02ce6aa87e380ab.pngQt元对象系统为何一定要继承自QObject?

分析QObject类:

449ca675c24f4138a45ddeb1fc204589.png

198928e677f54a35b3f29e4cb3d152c9.png

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

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

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


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

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

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

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

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

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

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

qObject_cast()动态类型转换。

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

目录
相关文章
|
1月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
84 3
(13) Qt事件系统(two)
|
1月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
74 0
(12)Qt事件系统(one)
|
3月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
3月前
|
API
Qt绘图之Paint系统
Qt绘图之Paint系统
61 2
|
3月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
206 4
|
3月前
从源码角度分析Qt元对象系统2
从源码角度分析Qt元对象系统
55 0
|
3月前
|
存储
从源码角度分析Qt元对象系统1
从源码角度分析Qt元对象系统
79 0
|
3月前
|
数据安全/隐私保护
【qt】获取主机信息系统
【qt】获取主机信息系统
17 0
|
6月前
|
Windows
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
183 1
Qt(C++)开发一款图片防盗用水印制作小工具