1。元对象系统 元对象系统是一个基于标准C的扩展,为Qt提供了信号与槽机制、实时类型信息、动态属性系统。 元对象系统的三个基本条件:类必须继承自QObject类声明QOBJECT宏(默认私有有)元对象编译器moc。 信号和槽机制是QT的核心机制,信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,信号和槽是QT自行定义的一种通信机制,它独立于标准的CC语言,要正确的处理信号和槽,必须借助一个称为moc(MetaObjectCompiler),也就是元对象编译器。它为高层次的事件处理自动生成所需要的必要代码。Qt程序在交由标准编译器编译之前,先要使用moc分析C源文件。如果moc发现在一个类头文件中包含了宏QOBJECT,则会生成以mocclassName。cpp(自定义类名)的。cpp文件。这个源文件中包含了QOBJECT宏的实现代码。新的文件同样将进入编译系统,与原文件一起参与编译。构建生成的。o文件包含moc生成的cpp文件。 QOBJECT定义在qobjectdefs。h文件中: 分析QOBJECT后,发现都是在操作元对象,并没有所谓的信号和槽,属性等内容,很显然,QObject对象能够支持这些功能,必然是通过QMetaObject这个元对象来实现的。 QMetaObject定义: Qt元对象系统为何一定要继承自QObject? 分析QObject类: 所以,QObject之所以为元对象系统的基类,因其提供了元对象系统很多支持工作: 信号与槽、事件处理、属性设置、国际化支持(翻译)、对象树资源管理等等。 点击领取Qt学习资料视频教程链接 使用QObject作为基类而不使用QOBJECT宏和元对象代码是可以的,但是如果QOBJECT宏没有被使用,那么这个类声明的信号和槽,以及其他特征描述都不会被调用。 元对象系统除实现信号与槽外,还有很多其他特性,比如: QObject::metaObject()返回与该类绑定的metaobject对象。 QMetaObject::className()可以在运行时以字符串的形式返回类的名字,不需要C编译器原生的运行时类型信息(RTTI)的支持。 QObject::inherits()函数返回继承信息:对象是否是QObject继承树上一个类的实例。 QObject::tr()和QObject::trUtf8()提供国际化支持,将字符串翻译成指定的语言。 QObject::setProperty()和QObject::property()通过名字动态设置和获取对象属性。 QMetaObject::newInstance()构造该类的一个新实例。 qObjectcast()动态类型转换。 一般建议在QObject的所有子类中使用QOBJECT宏,而不管它们是否使用了信号与槽。