图解Qt信号槽实现

信号槽实现需了解如下基础组件

  • 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、子对象的关系;信号槽的链接
    信号槽1

  • 一个信号触发后,如何调到槽函数的大致流程
    信号槽2

关注核心类、核心数据的流动,不要深陷细节。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值