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

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 宏技术,有了它们才使得提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统,最后大家如果想要了解更多json相关知识,敬请关注奇Q工具网。

推荐阅读:

java怎么写服务器?java写服务器方法

java技术栈面试流程是什么?附java技术栈面试题

java主函数的内容是什么?实例了解java主函数