不二如是 发表于 2016-10-23 11:30:12

111-元对象系统(Meta Object System)-【扫盲】

本帖最后由 不二如是 于 2016-10-23 16:22 编辑




憋急,我给你翻译下哈~

Qt中的元对象系统(Meta Object System)提供了对象间通信的信号和槽机制、运行时类型信息、动态属性系统。

元对象系统必须基于以下三个充分条件:


[*]该类必须继承自QObject类


[*]必须在类的似有声明区声明Q_OBJECT宏(类定义,未声明,默认private)


[*]元对象编译器Meta 0bject Complier(moc),为QObject子类实现元对象特性提供必要代码


moc工具读取一个C++源文件,如果发现一个或者多个类的声明中包含有Q_OBJECT宏。

便会另外创建一个C++源文件(debug目录下常见的以moc开头的C++源文件)

其中包含了为每一类生成的元对象代码。

static/image/hrline/line2.png

元对象系统主要是为了实现信号和槽机制才被引入的,不过除了信号和槽机制,元对象系统还提供了其他一些特性:

[*]QObject::metaObject()函数

返回一个类的元对象,是QMetaObject类的对象


[*]QMetaObject::className()函数

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


[*]QObject::inhertis()函数

返回一个对象是否是QObject继承树上一个类的实例信息


[*]QObject::tr()&QObject::trUtf8()函数

进行字符串翻译来实现国际化


[*]QObject::setProperty()&QObject::property()函数

通过名字来动态设置或者获取对象属性。


[*]QMetaObject()::newInstance()函数

构造该类的一个新实例



除了这些特性,还可以使用qobject_cast()函数来对QObject类进行动态类型转换

QObject *obj = new MyWidget;

QWidget *widget = qobject_cast<QWidget *>(obj);

这个函数尝试将他的参数转换为尖括号(<>)中的类型指针,如果是正确类型,返回一个非零的指针,不兼容,返回0.

My_A 发表于 2019-3-22 01:06:10

都是大佬
页: [1]
查看完整版本: 111-元对象系统(Meta Object System)-【扫盲】