信号槽实现需了解如下基础组件
- QObject - 核心数据
//QObject数据基类
class Q_CORE_EXPORT QObjectData {
public:
virtual ~QObjectData() = 0;
QObject *q_ptr;
QObject *parent;
QObjectList children;
uint isWidget : 1;
uint blockSig : 1;
uint wasDeleted : 1;
uint isDeletingChildren : 1;
uint sendChildEvents : 1;
uint receiveChildEvents : 1;
uint isWindow : 1; //for QWindow
uint unused : 25;
int postedEvents;
QDynamicMetaObjectData *metaObject;
QMetaObject *dynamicMetaObject() const;
};
//QObjectPrivate扩展数据
struct ExtraData
{
ExtraData() {}
#ifndef QT_NO_USERDATA
QVector<QObjectUserData *> userData;
#endif
QList<QByteArray> propertyNames;
QList<QVariant> propertyValues;
QVector<int> runningTimers;
QList<QPointer<QObject> > eventFilters; //事件过滤器数据集
QString objectName;
};
//QObjectPrivate数据概览
public:
ExtraData *extraData; // extra data set by the user
QThreadData *threadData; // id of the thread that owns the object
QObjectConnectionListVector *connectionLists; //最重要的:信号槽关联关系链表!
Connection *senders; // linked list of connections connected to this object
Sender *currentSender; // object currently activating the object
- QMetaObject
//QMetaObject核心数据类
struct { // private data
const QMetaObject *superdata; //最重要的:父类元对象!
const QByteArrayData *stringdata; //最重要的:字符串流,多种类信息!
const uint *data; //最重要的:二进制流,多种类信息。部分数据,通过Index索引从stringdata解析出来!
typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
StaticMetacallFunction static_metacall;
const QMetaObject * const *relatedMetaObjects;
void *extradata; //reserved for future use
} d;
如何通过QObject/QMetaObject实现信号槽
举个例子:初始阶段,老师的一个信号与学生的三个槽分别链接。程序启动后,触发老师的信号,然后学生的三个槽函数分别执行。
简述元对象、QObject、子对象的关系;信号槽的链接
一个信号触发后,如何调到槽函数的大致流程
关注核心类、核心数据的流动,不要深陷细节。