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
|