本文来自 CSDN 博客。x
似乎太困难了有些无从下手,想整理一下 QA xObject 动态信号和槽的实现。先随便写写,以后看懂了再继续
注: Qt5 stage 仓库已经引入一种全新的信号与槽的语法:信号可以和普通的函数、类的普通成员函数、 lambda 函数连接(而不再局限于信号函数和槽函数)详见 信号与槽的新语法 ( Qt5
meta object
网上关于元对象的解释已经很多了所以我简单提一下就可以了
派生自 QObject 类可以添加一个 Q_OBJECT 宏
#defin Q_OBJECT /
public: /
Q_OBJECT_CHECK /
static const QMetaObject staticMetaObject; /
virtual const QMetaObject *metaObject const; /
virtual void *qt_metacast const char * ; /
QT_P_FUNCTIONS /
int, virtual int qt_metacal QMetaObject::Call. void ** ; /
private: 运行 moc 对包含该类的文件进行预处理
为了清楚起见,moc xxx.h -o moc_xxx.cpp 生成的该文件包含我元对象的所有信息。看一下 QMetaObject 定义的数据成员局部:
struct QMetaObject
{
...
...
priv
struct { // privat data
const QMetaObject *superdata;
const char *stringdata;
const uint *data;
const void *extradata;
} d;
会发现里面一个字符数组和整数数组。对应这儿的 stringdata 和 data } 可以随便找一个 moc_xxx.cpp 文件。
信号与槽
moc 生成的文件中包括信号与槽的信息,正常情况下。而每一个信号或槽
有一个对应的字符串 ( 对应函数原型 )
有一个索引
有一个函数定义体 ( 信号和槽都是一个普通的函数 )