Qt信号与槽
GUI用户界面中,当用户操作一个窗口部件时,需要其他窗口部件响应,传统方式经常使用callback(回调机制)来实现。所谓回调即事先将函数指针作为参数传递另一个函数,然后在函数处理过程中适当地方调用回调函数回调机制有两个缺陷:类型不安全,不能保证调用函数过程中使用正确的参数;强耦合,处理函数必须知道调用哪个回调函数。Qt的信号与槽机制是类型安全的,松耦合,更灵活,更方便。
信号与槽(SignalSlot)是Qt编程的基础,也是Qt的一大创新。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。
信号(Signal)就是在特定情况下被发射的事件,例如PushButton最常见的信号就是鼠标单击时发射的clicked()信号。发射信号使用Qt的emit关键字。QT的signals关键字指出进入了信号声明区,随后即可声明自己的信号。
定义信号,如:
发射信号,如:
槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C函数是一样的,可以声明在类的任何部分(public、private或protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
声明两个槽方法,如:
槽方法中处理需要处理的工作,如:
GUI程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。
信号与槽关联是用QObject::connect()函数实现:
QMetaObject::ConnectionQObject::connect(
constQObjectsender,信号发送者
constcharsignal,发送的信号
constQObjectreceiver,信号接收者
constcharmethod,表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionTypetypeQt::AutoConnection连接方式,默认自动连接
)
常用格式:connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
用来表示信号和槽的参数都是字符串,Qt提供了两个宏用于构造这样的字符串:对于信号使用SIGNAL,对于槽则使用SLOT,用它们将函数的原型包围起来即可。注意connect方法采用SIGNAL()及SLOT()时,这里的函数原型只能写出类型,不能有任何参数名,否则连接将会失败。
同时信号与槽连接方式:
1)Qt::AutoConnection:(默认连接方式)自动方式,由系统自动选择连接方式。
2)Qt::DirectConnection:直接方式,信号发射时,立即调用槽。
3)Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
4)Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入阻塞状态,直到事件处理完毕,若接收方位于发送信号的线程中,则程序会死锁,故此连接方式仅用于多线程。
信号可以看做是特殊的函数,需要带括号,可带参数,信号无需实现也不能实现。槽函数需要带括号,有参数时还需要指明参数。当信号和槽函数带有参数时,在connect()函数里,要写明参数的类型。信号的参数需与槽的参数列表一致,允许比槽参数多。如果不匹配或参数过少,会出现编译错误或运行错误。在使用信号与槽的类中,必须在类的定义中加入宏QOBJECT。当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。
信号与槽的关联方式有如下特点:一个信号连接一个槽:
connect(sender,SIGNAL(single1()),receiver,SLOT(slotFun()));
如:
一个信号连接一个信号:
connect(sender,SIGNAL(single1()),receiver,SIGNAL(single2()));
如:
一个信号连接多个槽,关联信号的槽函数按照建立连接时的顺序依次执行:
connect(sender,SIGNAL(single1()),receiver1,SLOT(slotFun()));
connect(sender,SIGNAL(single1()),receiver2,SLOT(slotFun()));
connect(sender,SIGNAL(single1()),receiver3,SLOT(slotFun()));
如:
多个信号连接一个槽:
connect(sender1,SIGNAL(single1()),receiver,SLOT(slotFun()));
connect(sender2,SIGNAL(single2()),receiver,SLOT(slotFun()));
connect(sender3,SIGNAL(single3()),receiver,SLOT(slotFun()));
如:
信号与槽的自动关联:
uixxxx。h文件中connectSlotsByName()方法通过对象名支持信号与槽的自动关联。不采用connect()函数而是采用onobjectNamesignal命名方式命名槽达到自动关联的效果。
如类头文件中声明槽方法:
点击领取Qt学习资料视频教程链接
信号与槽的断开关联:
QObject::disconnect(constQObjectsender,constcharsignal,constQObjectreceiver,constcharmethod);断开与一个对象所有的信号的所有关联
disconnect(sender,0,0,0);
等价于:
senderdisconnect();断开与一个指定信号的所有关联
disconnect(sender,SIGNAL(single1()),0,0);
等价于:
senderdisconnect(SIGNAL(single1()));断开与一个指定接受者receiver的所有关联
disconnect(sender,0,receiver,0);
等价于:
senderdisconnect(SIGNAL(single1()));断开指定信号与槽的关联:
disconnect(sender,SIGNAL(single1()),receiver,SLOT(slotFun()));
等价于:
disconnect(myConnection);myConnection为connect()的返回值
如:
xxx。h文件中添加mres变量用于保存connect()返回值。
连接信号与槽:
断开该连接:
信号与槽机制的优越性:信号与槽机制是类型安全的,相关联的信号与槽参数必须匹配信号与槽是松耦合的,信号发送者不知道也不需知道接受者的信息。信号与槽可以使用任意类型的任意数量的参数。
韦德让一个半月板够不够?在NBA里,比它高的没它快,比它壮的没它快,它就是闪电侠韦德,一个让了联盟半个半月板的人。你们还有什么值得埋汰的,它选择抱团付出的代价有多大你们知道吗?早期在06年……
rimmel芮谜口红色号试色rimmel芮谜口红试色图今天给大家安利一个国外开架好用的彩妆品牌rimmel芮谜,其中它们家的口红是主打产品,显色度高,而且颜色丰富,便宜白菜!下面为大家介绍rimmel芮谜口红色号试色图rimmel……
网约车运力缺口背后的危机司机跑完了,怎么办?纵向深挖出行市场潜力,还是横向拓展出行行业后劲,这是一个好问题。但是不管选择哪一条路,都与运力两个字脱不了关系,这也正是各家平台烦恼所在。到底有没有第三条路?……
花瓣丸子头怎么扎,花瓣丸子头教程图解说起丸子头还是今年的热款发型之一,今天5号网美发小编再给大家推荐一款升级后的花瓣丸子头,如果你还在扎丸子头那就太OUT了,下面小编就来教大家花瓣丸子头的扎法步骤图解。花瓣丸子头……
cutepress12色眼影盘色号试色多少钱泰国cutepress推出了12色眼影盘,上色很方便,一点都不飞粉,适合新手。那么cutepress12色眼影盘色号有哪些?cutepress12色眼影盘多少钱?产品价格……
荣耀60Pro正式发布5000万前置摄像头超高颜值66w快充2021年12月1日,荣耀数字新机荣耀60Pro正式和广大消费者见面了。小芳我也是第一时间入手了这款手机。接下来小班就给大家简单地说一下荣耀60Pro这款手机有哪些亮点和不足以……
稚优泉眉笔色号试色稚优泉眉笔好用吗稚优泉的这款眉笔是双头的设计,非常适合懒人妹纸使用的,用一头画好眉毛之后,就可以用另一边的眉刷刷一下眉型哦!大家可以根据自己头发的颜色选择眉笔哦!稚优泉眉笔色号试色这款眉……
海蓝之谜鎏光焕变蜜粉多少钱?专柜价格海蓝之谜鎏光焕变蜜粉,超级柔光的一款,感觉妆效很棒,可以维持肌肤不脱妆,一盒很大,用两年是完全没有问题的,下面就来看看这款蜜粉价格吧!海蓝之谜鎏光焕变蜜粉多少钱价格780……
防晒霜倍数高就不会晒黑吗?不防水再高也没用有的小仙女只有到了炎炎夏日才想起来涂抹防晒,难道你真的不怕黑吗?一年四季都要防晒,这是不容置疑的,紫外线能穿透房屋,所以在室内也要防晒,下面5号网小编带大家来看一下防晒霜倍数高……
维生素b5对痘痘的功效这些成分治敏感于股掌如果你也是成分党,那你一定听说过维生素b5的强大功效,维生素b5主打修复敏感肌,下面5号网小编带大家来看一下维生素b5对痘痘的功效,这些成分治敏感于股掌。维生素b5对痘痘的功效……
雅诗兰黛303和203哪个好看全新倾慕唇釉303和203对比雅诗兰黛全新倾慕唇釉是今天的新品打,好多热门的色号,网络上的真人试色真的是乱花渐入迷人眼,试色图看得越多越不知道如何选择,小编就推荐这2款,下面5号网小编带大家来看一下雅诗兰黛……
怎么化妆又快又好超简单十分钟化妆教程大家好,我是那种没化妆做什么事都感觉很没自信,但是画完妆之后就有了走在大马路上用鼻孔看路的迷之自信;所以我出门一整天出门的话几乎都要化妆。但是每天早起不了时间很赶怎么办?!嘿嘿……