Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1983|回复: 0
打印 上一主题 下一主题

qt使用的元对象系统中两项关键技术是什么?

[复制链接]

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
跳转到指定楼层
楼主
发表于 2022-11-11 14:27:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

Qt元对象系统提供了信号与槽机制,用于对象间通信、运行时类型信息和动态属性系统。那qt使用的元对象系统中两项关键技术是什么?下面来我们就来给大家讲解一下。

1.MOC(元对象编译器),为每个 QObject 的子类提供必要的代码来实现元对象系统的特性。构建项目时,MOC 工具读取 C++ 源文件,当它发现类的定义里有 Q_OBJECT 宏时,它就会为这个类生成另外一个包含有元对象支持代码的 C++ 源文件,这个生成的源文件连同类的实现文件一起被编译和连接。通常这个新的C++原文件会再以前的C++原文件前面加上moc_作为新的文件名;

2.Q_OBJECT 宏,在一个类的 private 部分声明 ,使得类可以使用元对象的特性,如动态属性、信号与槽;

元对象系统的功能是什么?

除了提供在对象间通讯的机制外,元对象系统还包含以下几种功能:

QObject::metaObject()方法,获得与一个类相关联的meta-object;

QMetaObject::className()方法,在运行期间返回一个对象的类名,不需要本地C++编译器的 RTTI(run time type information)支持;

QObject::inherits()方法,用来判断一个对象的类是不是从一个特定的类继承而来;

QObject::tr()、QObject::trUtf8()方法,为软件的国际化翻译字符串;

QObject::setProperty()、QObject::property()方法,根据属性名动态的设置和获取属性值;

QMetaObject::newInstance()方法,构造类的新实例;

使用 qobject_cast()方法可以在在 QObject 类之间提供动态转换,qobject_cast()方法的功能类似于标准 C++ 的 dynamic_cast(),但是 qobject_cast() 不需要RTTI的支持。在一个 QObject 类或者它的派生类中,如果不定义 Q_OBJECT 宏,那么这些功能将不能被使用。从 meta-object 的观点来看,一个没有定义 Q_OBJECT 宏的类与它最接近的那个祖先类是相同的。那么 QMetaObject::className() 方法返回的名字并不是该类的名字,而是与它最近接的那个祖先类的名字。所以,任何从 QObject 继承的类都必须定义 Q_OBJECT 宏。

Meta Object 的所有数据和方法都封装在 QMetaObject 类中,它包含一个 Qt 类的 meta 信息,并且提供查询功能。meta 信息包含:

信号表(signal table),与对应 Qt 类相关的系统定义及自定义的 signal 的名字;

槽表(slot table),与对应 Qt 类相关的系统定义及自定义的 slot 的名字;

类信息表(class info table),Qt 类的类型信息;

属性表(property table),与对应类中的所有属性的名字;

指向 parent meta object 的指针;

qt使用的元对象系统中就是用到了MOC以及Q_OBJECT 宏技术,有了它们才使得提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统

https://qqe2.com/java/post/3992.html


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 07:36 , Processed in 0.055941 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表