qmoc文件_Qt(2):MOC文件解析
在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文件解析相关推荐
- VS2015——Qt工程不能生成moc文件的解决办法
问题:在VS2015开发Qt应用程序时发现,编译器提示无法关联信号槽,无法经过moc工具生成相关函数. 解决办法: 1.找到无法生成转换的槽函数头文件,右键头文件(xxx.h)-->找到属性选项 ...
- qmoc文件_Qt中Q_OBJECT与生成的moc文件的作用
Qt中Q_OBJECT与生成的moc文件的作用 一.先来了解Q_OBJECT 只有继承了QObject类的类,才具有信号槽的能力.所以,为了使用信号槽,必须继承QObject.凡是QObject类(不 ...
- qmoc文件_手动生成MOC文件
一直以来我都是将moc命令写成批处理文件,并且一直使用很正常,今早来要为一个类生成moc文件,批处理是直接由以前正常运行的批处理文件改成,应该是没有什么错误的,其结果却发现我所要的moc文件并没有生成 ...
- 3.MOC文件解读(下)——MOC文件中的函数
宏Q_OBJECT中的数据部分已经在在上一篇https://blog.csdn.net/Master_Cui/article/details/109007524分析完了,但是,MOC文件中还有一部分函 ...
- 2.MOC文件解读(上)——MOC文件中的数据
接上篇文章https://blog.csdn.net/Master_Cui/article/details/109007448 moc文件开始是个结构体 QT_BEGIN_MOC_NAMESPACE ...
- 工程是.java文件_1.8 工程相关解析(各种文件,资源访问)
本节引言: 前面讲了一堆看似和我们Android开发无关的东西是吧,当然是现在看似而已,以后你回头看就知道了! 好吧,本节我们就来以前面创建的Hello World项目为入口,来了解工程结构, 以及A ...
- SpringBoot文件上传源码解析
一.SpringMVC文件上传源码分析前言(这部分我觉得原作者写的很好) 该如何研究SpringMVC的文件上传的源码呢? 研究源码并不是仅仅知道程序是怎样运行的,而应该从宏观的角度.不同的立场去看待 ...
- android xml 未能解析文件,Android Studio提示“无法解析符号”,但项目已编译
我在build.gradle中使用以下内容在AndroidStudio中导入twitter4j: dependencies { compile 'com.android.support:support ...
- java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...
网友求助:dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件 问题importjava.text.SimpleDateFormat; import ...
- .so是什么文件_安卓 so 文件解析详解
so 文件是啥?so 文件是 elf 文件,elf 文件后缀名是.so,所以也被称之为so 文件, elf 文件是 linux 底下二进制文件,可以理解为 windows 下的PE文件,在 Andro ...
最新文章
- 2021河南省高考文科成绩排名查询,2021年河南高考成绩排名及一分一段表
- 070103_条件概率与贝叶斯公式,独立性
- 工业4.0进行时:增强现实技术如何变革制造业
- #pragma pack(1)的作用
- Redis 宝典 | 基础、高级特性与性能调优
- 在线实时大数据平台Storm本地模式运行的一个小发现
- (9)跨段跳转,短调用和长调用堆栈图
- 汇编语言 LOOP和[BX]的联合应用
- 使用shell根据端口号关闭进程
- javafx 调用java_Java,JavaFX的流畅设计风格拨动开关
- while和for循环
- JUnit 4 与 JUnit 3
- oracle 查看日志组切换状态_【DB笔试面试800】在Oracle中,归档和非归档模式之间的不同点是什么?它们各自的优缺点是什么?...
- 原型模式的原理与应用
- 十月第一周学习进度条
- opendss视频教程
- Java 获取本机IP地址
- vue引入 wps在线编辑版,可进行 预览,编辑, 打印等功能。
- C# F23.StringSimilarity库 字符串重复度、文本相似度、防抄袭
- 合成大西瓜之抱歉~ 我只有大西瓜和刀剑神域~!!