当前位置: 首页 > news >正文

QT Q_OBJECT 和 signals/slots

Q_OBJECT宏展开

#define Q_OBJECT \
public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static const QMetaObject staticMetaObject; \virtual const QMetaObject *metaObject() const; \virtual void *qt_metacast(const char *); \virtual int qt_metacall(QMetaObject::Call, int, void **); \QT_TR_FUNCTIONS \
private: \Q_OBJECT_NO_ATTRIBUTES_WARNING \Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \QT_WARNING_POP \struct QPrivateSignal {}; \QT_ANNOTATE_CLASS(qt_qobject, "")
  • QMetaObject类的作用是为QObject子类存储所有的元信息;还维护类的信号和槽之间的对应表,以及任何连接的类的信号和槽对应表。每一个信号槽都被分配了一个唯一的索引:
  • metaObject()函数对于普通的Qt类返回&staticMetaObject;处理QML对象返回dynamicMetaObject
  • qt_metacast()函数使用类的名称进行动态转换。这个函数是必须的,因为Qt不依赖标准C++RTTI(运行时类型信息)来检索关于一个对象或一个类的元数据
  • qt_metacast()直接通过索引调用一个内部信号或槽。因为使用的是索引而不是指针,所以没有指针的指针解读,生成的switch case可以被编译器大量优化(编译器可以在很早的时候直接包含跳转指令到特定的情况,避免大量的分支评估)。因此,信号/槽机制的执行是相当快的

siganls/slots/emit

  • 定义

    #define slots
    #define signals public
    #define emit
    
  • 当一个信号关键词被发射,QMetaObject::activate()被调用并带有改变的值和信号索引

  • QObject::connect():创建一个新的Connection,在qobject_p.h定义

struct Connection
{QObject *sender;QObject *receiver;union {StaticMetaCallFunction callFunction;QtPrivate::QSlotObjectBase *slotObj;};// The next pointer for the singly-linked ConnectionListConnection *nextConnectionList;//senders linked listConnection *next;Connection **prev;//...
};
  • Connection实例存储了一个指向信号发射器类(sender)、槽接收器类(receiver)的指针,及连接的信号槽关键字的索引。当一个信号被发射出去,每一个连接的槽都必须被调用。为了能做到这一点,每一个QObject为它每个信号都有一个Connection实例的链接列表,它的每个槽关键字也有同样的Connection链接列表
  • 这对链接列表允许Qt正确地走到每个依赖槽/信号对,以使用索引触发正确的函数。同理处理接收器的销毁。Qt走过双链接列表,将对象从它连接的地方删除
  • 这些机制发生在UI线程中。因为QThread类继承了QObject,任何QThread都可以使用信号/槽机制
http://www.lryc.cn/news/37160.html

相关文章:

  • APM新添加UAVCAN设备
  • 【C++】string类基本用法
  • KDZD耐电压高压击穿强度测试仪
  • 数组和指针面试题的补充(细的抠jio)
  • Java多线程基础
  • 爆品分析第5期 | 一条视频带货3700+,这款斋月不锈钢厨具套装火了!
  • 团队管理的七个要点
  • Go语言容器之map、list和nil
  • 软件测试的案例分析 - 闰年1
  • 【强化学习】强化学习数学基础:值函数近似
  • JVM系列——Java与线程,介绍线程原理和操作系统的关系
  • C++打开文件夹对话框之BROWSEINFO
  • Nuxt项目配置、目录结构说明-实战教程基础-Day02
  • 单链表的头插,尾插,头删,尾删等操作
  • Qt扫盲-QProcess理论总结
  • JAVA进阶 —— Steam流
  • Ubuntu Protobuf 安装(测试有效)
  • 驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记
  • 优化改进YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模块(超详细)
  • windows电脑pc如何使用svn获取文档和代码
  • ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)
  • ​力扣解法汇总1590. 使数组和能被 P 整除
  • Spring源码阅读(基础)
  • 服务搭建篇(九) 使用GitLab+Jenkins搭建CI\CD执行环境 (上) 基础环境搭建
  • CDC 长沙站丨云原生技术研讨会:数字兴链,云化未来!
  • A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法)
  • 香港酒店模拟分析项目报告--使用tableau、python、matlab
  • 第18天-商城业务(商品检索服务,基于Elastic Search完成商品检索)
  • 5.2 对射式红外传感器旋转编码器计次
  • 【数据库概论】第九章 关系查询处理和查询优化