前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >34.C++-QT信号槽分析

34.C++-QT信号槽分析

作者头像
诺谦
发布2022-05-10 14:05:17
1K0
发布2022-05-10 14:05:17
举报
文章被收录于专栏:Linux驱动

moc  元对象编译器, 全称是 Meta-Object Compiler,也就是“元对象编译器”。是QT翻译扩展语法到C++语言的工具,目前见扩展了信号与槽机制。 

信号/槽方式编程上更方便(不容易出错)

回调需要自行处理麻烦的回调管理,稍微不注意就出错。

而且信号/槽方式更利于mvc分离实现。

信号和槽机制的优点:

类型安全, 关联的信号和槽的参数必须是等同。

降低Qt对象间的耦合度,只需要emit,对象无需知道哪个对象来接收该信号,

信号槽的效率和回调函数相比,变低10倍, 原因如下:

  • 1)需要定位接收信号的对象。
  • 2)遍历所有的关联(如一信号对多槽)
  • 3)传递的参数
  • 4)多线程的时候。信号可能需要排队等待。 

1.信号和槽实现

1.Q_OBJECT

Q_OBJECT展开后,会有一个QMetaObject元对象静态类、还有一些元对象操作函数:

signals和slots:

我们以这为例:

预处理之前会调用moc程序,对文件预处理之后生成一个moc_xxx.cpp文件.

如下图所示:

moc会将signals和slots下的函数名转换为字符数组.并生成一个名称idx索引号.

然后生成一个qt_meta_data_Widget(由于类名是Widget,所以后缀是Widget)数组:

其中4,   14,表示有4个方法,然后14表示unit偏移位置,即qt_meta_data_Widget[14]就是第一个方法.

然后并创建一个qt_static_metacall回调函数,实现调用目标类指针的槽函数:

当我调用emit信号时,其实就是调用moc实现的一个信号函数, 信号函数内部调用了QMetaObject::activate()函数:

而activate函数就会去QObjectConnectionListVector连接链表容器里面查找信号对应的索引号所在的值,里面存放了每个接受对象指针和槽函数id的链表:

然后遍历该信号关联的链表里的所有目标对象指针和槽函数,并调用qt_static_metacall回调函数,实现调用槽函数.

connect:

connect会将信号和槽函数字符串化, 然后执行connect的时候会判断信号槽参数是否一致.并遍历”信号槽”字符串的索引号.如果索引号都定义了,则在发送方的连接链表容器的信号索引处,添加一个目标对象指针和槽函数索引号的类到链表中.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档