大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

系统架构
您现在的位置: 首页 > 系统架构 > QT > 《大宇:Qt入门到精通》 > [006]信号和槽

[006]信号和槽

发布时间:2017/11/21 《大宇:Qt入门到精通》 标签qt信号浏览次数:70

引:前几天实在有事不好意思啊,更新的有点慢,这几天全部补回来。

信号和槽是Qt编程的基础。它可以让应用程序之间相互通信,前面,已经把一些信号和槽连接在一起,做了几个笼统的解释,不掌握的朋友很正常,死记硬背的朋友我很佩服你。但不管学习进度如何,且听今天这节信号和槽的话题点。

关系:

信号和槽的关系,其实很简单,就是一个因,一个果,并且为必要并充分的条件关系。在我脑海里有一个生动且暴力的形象就是:一根引线一个炸弹,当一个引线被引燃的时候,就会使炸弹爆炸,然后话题由此展开。

槽函数:

什么是槽函数?

同学可以先理解为炸弹

一个名叫槽的函数[PS:不要被我的话给曲解],简称函数,相信有编程经验的童鞋一定知道函数是拿来干什么的,对,就是执行某种命令或者活动的方法。

槽函数和函数的区别在于,槽函数可以和信号连接在一起,意思就是只有槽函数才能和信号连接在一起[PS:知道信号连接信号的先知们请先别钻牛角尖],每当发射这个信号的时候,就会自动调用这个槽函数。

信号:

同学可以先理解为引线

模板:

connect(sender,SIGNAL(引线:信号),receiver,SLOT(炸弹:槽函数));

这里的sender和receiver可以根据英语函数表现为一个发送者一个接收者,我们可以忽略掉这个比喻,听大宇哥的,sender就是点火的那个,recevier就是被你绑在炸弹上的项目经理,没错,也可以是测试。你的仇恨值有多大,你就想象炸弹有多大。

前面的例子中,已经看到的实例中,我们已经把不同的信号和不同的槽连接在了一起,但还是那句话,一个程序在非必要充分的理由下,不要将其写的过于复杂,大道至简应该是今后程序员所推崇的一个本能,才能混迹于走向CTO的人生巅峰道路的一项软实力。[PS:装了下B,(⊙﹏⊙)应该没人打我吧。]

信号和槽能这么玩:

①:一个信号可以连接多个槽。

connect(sender,SIGNAL(signal1()),receiver,SLOT(slot1()));

connect(sender,SIGNAL(signal1()),receiver2,SLOT(slot2()));

大家可以先把目光放到我这边来,因为没有学过的同学,第一映像肯定是在找不同,没错,可有些不同是我特意加的,你找出来也许并不是本题的内涵所在。

相同点:两个信号都是同一个实例化对象sender发出,对,没错还是他点火,[他就是个大坏蛋]。

相同点2:signal1(),没错,还是原来的实例化对象发出来的信号signal1,可以想象为同一个人做同一件事情:点火。

不同点:receiver和receiver2,两个炸弹,两个不同的实例化对象。被执行了两个对象的方法:slot1()和slot2()。

左脑记忆法:

一天,你开开心心蹦蹦跳跳开心去上学,忽然发现你家领导被绑在一个大树上睡着了,于是你拿起书包里的两颗炸弹,放到他旁边,忽然发现只有一根引线,于是乎,你就把一根引线的前端和后端分别插入到了两个炸弹入口,准备从中间点火,起到一个人,一个动作,两个炸弹,两个事件同时引爆,同时发生的效果。

当然这只是执行了摆放好的准备工作,connect两句代码就被编译器执行了。至于什么时候引爆,就看你什么时候心情好。

重点PS:

在发射这个信号的时候,会以不确定的顺序一个接一个的调用槽函数。

②:多个信号可以连接同一个槽

connect(sender1,SIGNAL(signal1()),receiver,SLOT(slot1()));

connect(sender1,SIGNAL(signal2()),receiver,SLOT(slot1()));

connect(sender2,SIGNAL(signal3()),receiver,SLOT(slot1()));

相同点:实例化对象receiver和一件事slot1,好了,我不做比喻了,有同学已经要举报我这个网站博客了,不过,slot()什么事件,请脑补/笑Cry。

不同点:不同的对象,不同的事件。

看来大家的共同点都是朝着一个方向啊。

③:一个信号可以与另外一个信号相连接:

connect(sender1,SIGNAL(信号1),sender2,SIGNAL(信号2));

当发射第一个信号时,也会发射第二个信号。但因为这个特性,信号与信号之间的连接和信号与槽之间的连接是难以区分的,用不用看个人。[PS:小编别拦着我,给你们做个比喻,其实就是加长引线……]

移除连接:

当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下:

bool QObject::disconnect ( const QObject * sender, const char * signal, const Object * receiver, const char * member ) [static] 断开与某个对象相关联的任何对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或者多个信号,这些信号与另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就可以利用这个方法,非常之简洁。
disconnect( sender, 0, 0, 0 ) ;

or

sender->disconnect()

断开与某个特定信号的任何关联。

disconnect( sender, SIGNAL(signal1()), 0, 0 ) 

or

sender->disconnect( SIGNAL(signal1()) )

断开两个对象之间的关联。

disconnect( sender, 0, receiver, 0 ) 

or

sender->disconnect(  receiver)

在 disconnect 函数中 0 可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者sender 不能为 0,其它三个参数的值可以等于 0。

PS:

如果disconnect环节中,参数类型不匹配,信号或槽的内存被析构掉了,再或者根本就没被定义出来过的时候,Qt会在运行时发出警告或者报错。[看你警告等级调的有多高]

不仅仅在窗口部件之间使用信号和槽,只要继承与QObject父类的继承类,都能使用。

 

56.2K

您好!请登录

合作网站快捷登录:
点击取消回复

已有0评论

    购物盒子

    点击这里给我发消息点击这里给我发消息