Qt之信号槽机制及优缺点

更新时间:2023-06-30 10:17:39 阅读: 评论:0

Qt之信号槽机制及优缺点
newone>dees1. Qt 信号槽机制 概念: 信号槽是 Qt 框架引以为豪的机制之⼀。所谓信号槽,实际就是观察者模式。当某个事件发⽣之后,⽐如,按钮检测到⾃⼰被点击了⼀下,它就会发出⼀个信号(signal)。这种发出是没有⽬的的,类似⼴播。如果有对象对这个信号感兴趣,它就会使⽤连接(connect)函数,意思是,将想要处理的信号和⾃⼰的⼀个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会⾃动被回调。
槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数⼏乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调⽤。唯⼀区别的是:槽可以与信号连接在⼀起,每当和槽连接的信号被发射的时候,就会调⽤这个槽。
⾃定义信号槽注意事项:
(1)发送者和接收者都需要是QObject的⼦类(当然,槽函数是全局函数、Lambda 表达式等⽆需接收者的时候除外);
(2)使⽤ signals 标记信号函数,信号是⼀个函数声明,返回 void,不需要实现函数代码;
(3)槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
assignedto
(4)使⽤ emit 在恰当的位置发送信号;littlegirl
(5)使⽤QObject::connect()函数连接信号和槽;
(6)任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。
信号槽的多种⽤法:
(1)⼀个信号可以和多个槽相连
  如果是这种情况,这些槽会⼀个接⼀个的被调⽤,但是它们的调⽤顺序是不确定的。
(2)多个信号可以连接到⼀个槽
  只要任意⼀个信号发出,这个槽就会被调⽤。aobao
(3)⼀个信号可以连接到另外的⼀个信号
  当第⼀个信号发出时,第⼆个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。
(4)槽可以被取消链接
  这种情况并不经常出现,因为当⼀个对象delete之后,Qt⾃动取消所有连接到这个对象上⾯的槽。
(5)使⽤Lambda 表达式
  在使⽤ Qt 5 的时候,能够⽀持 Qt 5 的编译器都是⽀持 Lambda 表达式的。
总结:
加拿大森林大火2. QT信号槽机制的优缺点 (1)问题: 为什么Qt使⽤信号与槽机制⽽不是传统的回调函数机制进⾏对象间的通信呢? 回调函数的本质
是“你想让别⼈的代码执⾏你的代码,⽽别⼈的代码你⼜不能动”这种需求下产⽣的。 回调函数是函数指针的⼀种⽤法,如果多个类都关注某个类的状态变化,此时需要维护⼀个列表,以存放多个回调函数的地址。对于每⼀个被关注的类,都需要做类似的⼯作,因此这种做法效率低,不灵活。 (2)解决办法: Qt使⽤信号与槽机制来解决这个问题,程序员只需要指定⼀个类含有哪些信号函数、哪些槽函数,Qt 会处理信号函数和槽函数之间的绑定。当信号函数被调⽤时,Qt会找到并执⾏与其绑定的槽函数。允许⼀个信号函数和多个槽函数绑
基督教圣诞节小品高考语文卷定,Qt会依次找到并执⾏与⼀个信号函数绑定的所有槽函数,这种处理⽅式更灵活。 (3)优点: Qt信号与槽机制降低了Qt对象的耦合度.
3. 多线程情况下, Qt中的信号槽分别在什么线程中执⾏, 如何控制? 通过connect函数的第五个参数connectType来控制。 connect⽤于连接qt的信号和槽,在qt编程过程中不可或缺。它其实有第五个参数,只是⼀般使⽤默认值,在满⾜某些特殊需求的时候可能需要⼿动设置。
Qt::AutoConnection: 默认值,使⽤这个值则连接类型会在信号发送时决定。如果接收者和发送者在同⼀个线程,则⾃动使⽤
tsutsuQt::DirectConnection类型。如果接收者和发送者不在⼀个线程,则⾃动使⽤Qt::QueuedConnection类型。
shenzhouQt::DirectConnection:槽函数会在信号发送的时候直接被调⽤,槽函数运⾏于信号发送者所在线程。效果看上去就像是直接在信号发送位置调⽤了槽函数。这个在多线程环境下⽐较危险,可能会造成奔溃。
Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调⽤,槽函数运⾏于信号接收者所在线程。发送信号之后,槽函数不会⽴刻被调⽤,等到接收者的当前函数执⾏完,进⼊事件循环之后,槽函数才会被调⽤。多线程环境下⼀般⽤这个。
Qt::BlockingQueuedConnection:槽函数的调⽤时机与Qt::QueuedConnection⼀致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运⾏完。接收者和发送者绝对不能在⼀个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在⼀起使⽤。当这个flag设置时,当某个信号和槽已经连接时,再进⾏重复的连接就会失败。也就是避免了重复连接。

本文发布于:2023-06-30 10:17:39,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/162494.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   信号   需要   线程   接收者   机制   连接
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图