鱼C论坛

 找回密码
 立即注册
查看: 3936|回复: 1

[技术原创] 111-元对象系统(Meta Object System)-【扫盲】

[复制链接]
发表于 2016-10-23 11:30:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

0.jpg
1.jpg


憋急,我给你翻译下哈~

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

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

  • 该类必须继承自QObject类

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

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


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

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

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


                               
登录/注册后可看大图


元对象系统主要是为了实现信号和槽机制才被引入的,不过除了信号和槽机制,元对象系统还提供了其他一些特性:
  • 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.

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-22 01:06:10 | 显示全部楼层
都是大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 16:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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