在Qt下,从QObject派生的类都会生成moc_文件。

1. 比如现在有2个文件,qmyobject.h和qmyobject.cpp,它里面有一个类QMyObject,记为版本A

classQMyObject :publicQObject

{

Q_OBJECT

public:

QMyObject(QObject *parent);

~QMyObject();

};

然后我们给其添加一个信号和一个槽函数,即修改后的qmyobject.h的内容如下,记为版本B。

classQMyObject :publicQObject

{

Q_OBJECT

public:

QMyObject(QObject *parent);

~QMyObject();

signals:

voidsignalFunc(double);

protectedslots:

voidslotFunc(double);

};

下面给出2个这2个版本的moc文件

未添加signal/slot

添加了signal/slot

/****************************************************************************

** Meta object code from reading C++ file 'qmyobject.h'

**

** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1)

**

** WARNING! All changes made in this file will be lost!

*****************************************************************************/

#include "../../qmyobject.h"

#include

#include

#if !defined(Q_MOC_OUTPUT_REVISION)

#error "The header file 'qmyobject.h' doesn't include ."

#elif Q_MOC_OUTPUT_REVISION != 67

#error "This file was generated using the moc from 5.2.1. It"

#error "cannot be used with the include files from this version of Qt."

#error "(The moc has changed too much.)"

#endif

QT_BEGIN_MOC_NAMESPACE

structqt_meta_stringdata_QMyObject_t {

QByteArrayData data[1];

charstringdata[11];

};

#define QT_MOC_LITERAL(idx, ofs, len) \

Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \

offsetof(qt_meta_stringdata_QMyObject_t, stringdata) + ofs \

- idx * sizeof(QByteArrayData) \

)

staticconstqt_meta_stringdata_QMyObject_t qt_meta_stringdata_QMyObject = {

{

QT_MOC_LITERAL(0, 0, 9)

},

"QMyObject\0"

};

#undef QT_MOC_LITERAL

staticconstuint qt_meta_data_QMyObject[] = {

// content:

7,       // revision

0,       // classname

0,    0, // classinfo

0,    0, // methods

0,    0, // properties

0,    0, // enums/sets

0,    0, // constructors

0,       // flags

0,       // signalCount

0        // eod

};

voidQMyObject::qt_static_metacall(QObject *_o, QMetaObject::Call _c,int_id,void**_a)

{

Q_UNUSED(_o);

Q_UNUSED(_id);

Q_UNUSED(_c);

Q_UNUSED(_a);

}

constQMetaObject QMyObject::staticMetaObject = {

{ &QObject::staticMetaObject, qt_meta_stringdata_QMyObject.data,

qt_meta_data_QMyObject,  qt_static_metacall, 0, 0}

};

constQMetaObject *QMyObject::metaObject()const

{

returnQObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;

}

void*QMyObject::qt_metacast(constchar*_clname)

{

if(!_clname)return0;

if(!strcmp(_clname, qt_meta_stringdata_QMyObject.stringdata))

returnstatic_cast(const_cast(this));

returnQObject::qt_metacast(_clname);

}

intQMyObject::qt_metacall(QMetaObject::Call _c,int_id,void**_a)

{

_id = QObject::qt_metacall(_c, _id, _a);

if(_id

return_id;

return_id;

}

QT_END_MOC_NAMESPACE

/****************************************************************************

** Meta object code from reading C++ file 'qmyobject.h'

**

** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1)

**

** WARNING! All changes made in this file will be lost!

*****************************************************************************/

#include "../../qmyobject.h"

#include

#include

#if !defined(Q_MOC_OUTPUT_REVISION)

#error "The header file 'qmyobject.h' doesn't include ."

#elif Q_MOC_OUTPUT_REVISION != 67

#error "This file was generated using the moc from 5.2.1. It"

#error "cannot be used with the include files from this version of Qt."

#error "(The moc has changed too much.)"

#endif

QT_BEGIN_MOC_NAMESPACE

structqt_meta_stringdata_QMyObject_t {

QByteArrayData data[4];

charstringdata[32];

};

#define QT_MOC_LITERAL(idx, ofs, len) \

Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \

offsetof(qt_meta_stringdata_QMyObject_t, stringdata) + ofs \

- idx * sizeof(QByteArrayData) \

)

staticconstqt_meta_stringdata_QMyObject_t qt_meta_stringdata_QMyObject = {

{

QT_MOC_LITERAL(0, 0, 9),

QT_MOC_LITERAL(1, 10, 10),

QT_MOC_LITERAL(2, 21, 0),

QT_MOC_LITERAL(3, 22, 8)

},

"QMyObject\0signalFunc\0\0slotFunc\0"

};

#undef QT_MOC_LITERAL

staticconstuint qt_meta_data_QMyObject[] = {

// content:

7,       // revision

0,       // classname

0,    0, // classinfo

2,   14, // methods

0,    0, // properties

0,    0, // enums/sets

0,    0, // constructors

0,       // flags

1,       // signalCount

// signals: name, argc, parameters, tag, flags

1,    1,   24,    2, 0x06,

// slots: name, argc, parameters, tag, flags

3,    1,   27,    2, 0x09,

// signals: parameters

QMetaType::Void, QMetaType::Double,    2,

// slots: parameters

QMetaType::Void, QMetaType::Double,    2,

0        // eod

};

voidQMyObject::qt_static_metacall(QObject *_o, QMetaObject::Call _c,int_id,void**_a)

{

if(_c == QMetaObject::InvokeMetaMethod) {

QMyObject *_t = static_cast(_o);

switch(_id) {

case0: _t->signalFunc((*reinterpret_cast(_a[1])));break;

case1: _t->slotFunc((*reinterpret_cast(_a[1])));break;

default: ;

}

} elseif(_c == QMetaObject::IndexOfMethod) {

int*result =reinterpret_cast(_a[0]);

void**func =reinterpret_cast(_a[1]);

{

typedefvoid(QMyObject::*_t)(double);

if(*reinterpret_cast<_t>(func) ==static_cast<_t>(&QMyObject::signalFunc)) {

*result = 0;

}

}

}

}

constQMetaObject QMyObject::staticMetaObject = {

{ &QObject::staticMetaObject, qt_meta_stringdata_QMyObject.data,

qt_meta_data_QMyObject,  qt_static_metacall, 0, 0}

};

constQMetaObject *QMyObject::metaObject()const

{

returnQObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;

}

void*QMyObject::qt_metacast(constchar*_clname)

{

if(!_clname)return0;

if(!strcmp(_clname, qt_meta_stringdata_QMyObject.stringdata))

returnstatic_cast(const_cast(this));

returnQObject::qt_metacast(_clname);

}

intQMyObject::qt_metacall(QMetaObject::Call _c,int_id,void**_a)

{

_id = QObject::qt_metacall(_c, _id, _a);

if(_id

return_id;

if(_c == QMetaObject::InvokeMetaMethod) {

if(_id

qt_static_metacall(this, _c, _id, _a);

_id -= 2;

} elseif(_c == QMetaObject::RegisterMethodArgumentMetaType) {

if(_id

*reinterpret_cast(_a[0]) = -1;

_id -= 2;

}

return_id;

}

// SIGNAL 0

voidQMyObject::signalFunc(double_t1)

{

void*_a[] = { 0,const_cast(reinterpret_cast(&_t1)) };

QMetaObject::activate(this, &staticMetaObject, 0, _a);

}

QT_END_MOC_NAMESPACE

在右边一栏:

qt_meta_stringdata_QMyObject_t:

代表QMyObject中的函数名。

qt_meta_data_QMyObject:

methods部分前面的2代表此类中信号和槽总数为2,14代表qt_meta_data_QMyObject中的content的个数,一共有14个,对应着QMetaObjectPrivate变量的14个成员变量。

信号前面的是1,而槽前面的是3,在看看

"QMyObject\0signalFunc\0\0slotFunc\0"

我们如果以\0作为索引,一对比就知道signalFunc的索引为1,而slotFunc的索引为3。

然后看看源对象定义:

constQMetaObject myClass::staticMetaObject = {

{ &QObject::staticMetaObject, qt_meta_stringdata_myClass,

qt_meta_data_myClass, 0 }

};

可以看到源对象的数据定义为:

struct{// private data

constQMetaObject *superdata;

constchar*stringdata;

constuint *data;

constvoid*extradata;

}

参考:

1. http://blog.csdn.net/smad732/article/details/6107448#

FROM: http://blog.csdn.net/oldmtn/article/details/46346625

qmoc文件_Qt(2):MOC文件解析相关推荐

  1. VS2015——Qt工程不能生成moc文件的解决办法

    问题:在VS2015开发Qt应用程序时发现,编译器提示无法关联信号槽,无法经过moc工具生成相关函数. 解决办法: 1.找到无法生成转换的槽函数头文件,右键头文件(xxx.h)-->找到属性选项 ...

  2. qmoc文件_Qt中Q_OBJECT与生成的moc文件的作用

    Qt中Q_OBJECT与生成的moc文件的作用 一.先来了解Q_OBJECT 只有继承了QObject类的类,才具有信号槽的能力.所以,为了使用信号槽,必须继承QObject.凡是QObject类(不 ...

  3. qmoc文件_手动生成MOC文件

    一直以来我都是将moc命令写成批处理文件,并且一直使用很正常,今早来要为一个类生成moc文件,批处理是直接由以前正常运行的批处理文件改成,应该是没有什么错误的,其结果却发现我所要的moc文件并没有生成 ...

  4. 3.MOC文件解读(下)——MOC文件中的函数

    宏Q_OBJECT中的数据部分已经在在上一篇https://blog.csdn.net/Master_Cui/article/details/109007524分析完了,但是,MOC文件中还有一部分函 ...

  5. 2.MOC文件解读(上)——MOC文件中的数据

    接上篇文章https://blog.csdn.net/Master_Cui/article/details/109007448 moc文件开始是个结构体 QT_BEGIN_MOC_NAMESPACE ...

  6. 工程是.java文件_1.8 工程相关解析(各种文件,资源访问)

    本节引言: 前面讲了一堆看似和我们Android开发无关的东西是吧,当然是现在看似而已,以后你回头看就知道了! 好吧,本节我们就来以前面创建的Hello World项目为入口,来了解工程结构, 以及A ...

  7. SpringBoot文件上传源码解析

    一.SpringMVC文件上传源码分析前言(这部分我觉得原作者写的很好) 该如何研究SpringMVC的文件上传的源码呢? 研究源码并不是仅仅知道程序是怎样运行的,而应该从宏观的角度.不同的立场去看待 ...

  8. android xml 未能解析文件,Android Studio提示“无法解析符号”,但项目已编译

    我在build.gradle中使用以下内容在AndroidStudio中导入twitter4j: dependencies { compile 'com.android.support:support ...

  9. java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...

    网友求助:dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件 问题importjava.text.SimpleDateFormat; import ...

  10. .so是什么文件_安卓 so 文件解析详解

    so 文件是啥?so 文件是 elf 文件,elf 文件后缀名是.so,所以也被称之为so 文件, elf 文件是 linux 底下二进制文件,可以理解为 windows 下的PE文件,在 Andro ...

最新文章

  1. 2021河南省高考文科成绩排名查询,2021年河南高考成绩排名及一分一段表
  2. 070103_条件概率与贝叶斯公式,独立性
  3. 工业4.0进行时:增强现实技术如何变革制造业
  4. #pragma pack(1)的作用
  5. Redis 宝典 | 基础、高级特性与性能调优
  6. 在线实时大数据平台Storm本地模式运行的一个小发现
  7. (9)跨段跳转,短调用和长调用堆栈图
  8. 汇编语言 LOOP和[BX]的联合应用
  9. 使用shell根据端口号关闭进程
  10. javafx 调用java_Java,JavaFX的流畅设计风格拨动开关
  11. while和for循环
  12. JUnit 4 与 JUnit 3
  13. oracle 查看日志组切换状态_【DB笔试面试800】在Oracle中,归档和非归档模式之间的不同点是什么?它们各自的优缺点是什么?...
  14. 原型模式的原理与应用
  15. 十月第一周学习进度条
  16. opendss视频教程
  17. Java 获取本机IP地址
  18. vue引入 wps在线编辑版,可进行 预览,编辑, 打印等功能。
  19. C# F23.StringSimilarity库 字符串重复度、文本相似度、防抄袭
  20. 合成大西瓜之抱歉~ 我只有大西瓜和刀剑神域~!!

热门文章

  1. ESP32文件系统esp_littlefs实例
  2. 1.新建laravel项目
  3. apache-ant-1.7 下载
  4. 考勤统计表sql 某个项目在某个月的考勤统计
  5. Angular7入门辅助教程(六)——Subject(可多播的可观察对象)
  6. 关于销售的成本和收入
  7. 现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作
  8. 灭绝师太(女博士)、李莫愁(女硕士)、黄蓉(本科生)、小龙女(专科生)可爱
  9. STM32F446高性能MCU芯片介绍
  10. 年薪80万难觅技术人才 杭州区块链人才需求旺盛