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