在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. OWASP TOP10(2017)
  2. 内网java发送邮件_基于JavaMail的Java邮件发送:简单邮件发送
  3. [原创]安装Ubuntu Server 14.04后
  4. C语言包含字母的2D面板中搜索给定的单词的算法(附完整源码)
  5. dwz(jui)刷新当前dialog的方法
  6. 文件循环读取_一个案例轻松认识Python文件处理提取文件中的数字
  7. 三. 自动化测试用例设计
  8. VMware vsphere中虚拟机的基本操作方法
  9. 21. 包含min函数的栈(C++版本)
  10. ubuntu18.04-安装-wechat
  11. 使用 tftp 无法向服务器上传文件问题解决
  12. 全彩控制器的编程软件有哪些_可编程LED控制器-MINI全彩控制器软件(DC-Color)v1.08 官方版-腾牛下载...
  13. Win10更改用户账户、appdata和ProgramData的默认存储路径
  14. 论文写作——origin画图
  15. 这是一份普通的cpp答卷,可能有错
  16. 2021-02-03-隐藏Tomcat版本号
  17. Deep Hashing Network for Efficient Similarity Retrieval
  18. gsoap使用方法及心得
  19. JAVA基础--QR_Code二维码生成
  20. 制作windows服务(java)

热门文章

  1. linux服务器光衰,交换机、linux光衰查询
  2. AndroidQ(十)Android Q功能和API
  3. Linux block multi-queue (blk-mq) 机制
  4. win 10 设置静态ip 子网前缀长度
  5. 现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作
  6. 去掉小数点后多余的0
  7. linux 查看任务管理器,LINUX查看进程的4种方法(小结)
  8. progress进度条滚动动画
  9. java基础之String类型
  10. 培训linux系统下载,非常好的Linux培训教程集合下载