图解Qt信号槽实现
https://blog.csdn.net/sun222555888/article/details/80642740
信号槽实现需了解如下基础组件
QObject - 核心数据
1 //QObject数据基类
2 class Q_CORE_EXPORT QObjectData {
3 public:
4 virtual ~QObjectData() = 0;
5 QObject *q_ptr;
6 QObject *parent;
7 QObjectList children;
8
9 uint isWidget : 1;
10 uint blockSig : 1;
11 uint wasDeleted : 1;
12 uint isDeletingChildren : 1;
13 uint sendChildEvents : 1;
14 uint receiveChildEvents : 1;
15 uint isWindow : 1; //for QWindow
16 uint unused : 25;
17 int postedEvents;
18 QDynamicMetaObjectData *metaObject;
19 QMetaObject *dynamicMetaObject() const;
20 };
//QObject数据基类
1 //QObjectPrivate扩展数据
2 struct ExtraData
3 {
4 ExtraData() {}
5 #ifndef QT_NO_USERDATA
6 QVector<QObjectUserData *> userData;
7 #endif
8 QList<QByteArray> propertyNames;
9 QList<QVariant> propertyValues;
10 QVector<int> runningTimers;
11 QList<QPointer<QObject> > eventFilters; //事件过滤器数据集
12 QString objectName;
13 };
1 //QObjectPrivate数据概览
2 public:
3 ExtraData *extraData; // extra data set by the user
4 QThreadData *threadData; // id of the thread that owns the object
5
6 QObjectConnectionListVector *connectionLists; //最重要的:信号槽关联关系链表!
7
8 Connection *senders; // linked list of connections connected to this object
9 Sender *currentSender; // object currently activating the object
QMetaObject
1 //QMetaObject核心数据类
2 struct { // private data
3 const QMetaObject *superdata; //最重要的:父类元对象!
4 const QByteArrayData *stringdata; //最重要的:字符串流,多种类信息!
5 const uint *data; //最重要的:二进制流,多种类信息。部分数据,通过Index索引从stringdata解析出来!
6 typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
7 StaticMetacallFunction static_metacall;
8 const QMetaObject * const *relatedMetaObjects;
9 void *extradata; //reserved for future use
10 } d;
如何通过QObject/QMetaObject实现信号槽
举个例子:初始阶段,老师的一个信号与学生的三个槽分别链接。程序启动后,触发老师的信号,然后学生的三个槽函数分别执行。
简述元对象、QObject、子对象的关系;信号槽的链接
一个信号触发后,如何调到槽函数的大致流程
关注核心类、核心数据的流动,不要深陷细节。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」