下面来说说Qt的MetaObject。

Qt meta-object系统基于三个方面:
1、QObject提供一个基类,方便派生类使用meta-object系统的功能;
2、Q_OBJECT宏,在类的声明体内激活meta-object功能,比如动态属性、信号、槽;
3、Meta Object编译器(MOC),为每个QObject派生类生成代码,以支持meta-object功能。

QObject定义了从一个QObject对象访问meta-object功能的接口,Q_OBJECT宏用来告诉编译器该类需要激活meta- object功能,编译器在扫描一个源文件时,如果发现类的声明中有这个宏,就会生成一些代码来为支持meta-object功能——主要是生成该类对应 MetaObject类以及对QObject的函数override。

QObject和QMetaObject:
顾名思义,QMetaObject包含了QObject的所谓的元数据,也就是QObject信息的一些描述信息:除了类型信息外,还包含QT中特 有的signal&slot信息。

QObject::metaObject ()方法返回一个QObject对象对应的metaobject对象,注意这个方法是virtual方法。如上文所说,如果一个类的声明中包含了 Q_OBJECT宏,编译器会生成代码来实现这个类对应的QMetaObject类,并重载QObject::metaObject()方法来返回这个 QMetaObject类的实例引用。这样当通过QObject类型的引用调用metaObejct方法时,返回的是这个引用的所指的真实对象的 metaobject。

如果一个类从QObject派生,确没有声明Q_OBJECT宏,那么这个类的metaobject对象不会被生成,这样这个类所声明的 signal slot都不能使用,而这个类实例调用metaObject()返回的就是其父类的metaobject对象,这样导致的后果就是你从这个类实例获得的元 数据其实都是父类的数据,这显然给你的代码埋下隐患。因此如果一个类从QOBject派生,它都应该声明Q_OBJECT宏,不管这个类有没有定义 signal&slot和Property。

这样每个QObject类都有一个对应的QMetaObject类,形成一个平行的类型层次。

QMetaObjectPrivate的数据定义:
QMetaObjectPrivate是QMetaObject的私有实现类,其数据定 义部分如下(见头文件qmetaobject_p.h)。该数据结构全是int类型,一些是直接的int型信息,比如classInfoCount、 methodCount等,还有一些是用于在QMetaObject的stringdata和data内存块中定位信息的索引值。下文结合这两个内存块的 结构再分析个字段的含义。
struct QMetaObjectPrivate
{
int revision;
int className;
int classInfoCount, classInfoData;
int methodCount, methodData;
int propertyCount, propertyData;
int enumeratorCount, enumeratorData;
int constructorCount, constructorData; //since revision 2
int flags; //since revision 3
int signalCount; //since revision
}

Qt MetaObject 介绍相关推荐

  1. Qt MetaObject 详解

    这个系列的几篇文章通过阅读Qt帮助文档和相关的源代码来学习研究Qt meta-object所提供的功能,及其实现的方式. Qt meta-object系统基于三个方面: 1.QObject提供一个基类 ...

  2. QT Creator介绍

    文章目录 1 QT Creator介绍 1.1 QT Creator 1.2 QT Creator中调试的基本方法 2 Qt Creator工程管理 2.1 Qt Creator工程管理简介 2.2 ...

  3. Qt MetaObject sysmtem 详解之三:QMetaObject接口实现

    本篇从Qt MetaObject源代码解读相关接口的实现,这些接口都定义于qmetaobject.cpp中. QMetaObject::className() inline const char *Q ...

  4. 1.4 Qt工具之Qt Linguist介绍

    转自:http://www.hellotongtong.com/Qt5base1/qtlinguist-intro.html 1.4 Qt工具之Qt Linguist介绍 ***[免费下载源码和PPT ...

  5. Qt Phonon介绍及安装

      Qt Phonon介绍及安装 目前在Qt 4.6中实现多媒体播放图形界面主要依赖于phonon框架,其实qt中还有一个Multimedia模块,帮助文档中对它的描述是:实现底层的多媒体播放功能,在 ...

  6. PyQT5 之 Qt Designer 介绍与入门

    From:https://www.jianshu.com/p/5b063c5745d0 养薛定谔的猫 简书:https://www.jianshu.com/u/bf82b363ae88 Qt Desi ...

  7. Qt MetaObject 详解之二:QMeta数据以及数据结构信息

    如果一个类的声明中包含Q_OBJECT宏,那么qmake将为这个类生成 meta信息,这个信息在前一篇中所提到的moc文件中.这一篇通过解析这个一个示例moc文件来阐述这些meta信息的存储方式和格式 ...

  8. Qt Assistant介绍

    简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...

  9. Qt Linguist 介绍

    原文: https://blog.csdn.net/liang19890820/article/details/50274409 简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的 ...

最新文章

  1. 在虚拟主机中无法实现缩放等交互
  2. 【深度学习问题整理】
  3. 使用VS2010编译Qt 5.6.1过程记录
  4. 局域网ARP病毒的清理
  5. 跨境电商ERP系统有几大功能?
  6. 一起撸个朋友圈吧 (Step6) 评论对齐(点击评论对齐)【下】
  7. 为什么程序员做测试其实是有优势的?这是我听过最....的话
  8. java 读取excel文件
  9. highcharts饼图
  10. 网上很多NV21数据直接使用BitmapFactory的代码是错误的
  11. 免费模板 | 高颜值超实用,这套财务分析模版自带BUFF加成
  12. MySQL+Navicat安装配置
  13. 小米路由器 R1D 可用 java JRE openjdk
  14. matlab的hilbert变换的实现
  15. cad字体安装_1.1.2 CAD篇之字体库设置
  16. VirtualBoX下linux中安装增强功能
  17. 送你一份perl书单
  18. linux定时每隔多少天,Linux中Cron任务间隔执行:每隔几分钟/几小时/几天
  19. 15个最好的免费开源电子商务平台
  20. The rhetorics of sovereignty: representing Indian territory in nineteenth-century newspapers 【翻译】

热门文章

  1. jenkins教程菜鸟_使用 jenkins 自动化部署应用(写给新手的)
  2. 在python中有关函数的表达正确的是_在 Python 中有关函数的表达中正确的是( )。_学小易找答案...
  3. 合并多个Excel ,批量修改sheet名,批量删除多个指定sheet
  4. rk3128有多少个bank_rk3128网络机顶盒一些测试结果
  5. (转载)Windows为什么越用越慢而Linux却不会?
  6. 案例3:网购秒杀系统架构设计案例
  7. 阿里云无影云电脑初体验及引发的思考
  8. 火龙果的丰富美容营养
  9. 错过BTC就不要在错过Micoin
  10. 2017 年崛起的 JavaScript 项目