鱼C论坛

 找回密码
 立即注册
查看: 3733|回复: 2

[技术原创] 101-信号和槽机制-Qt核心-【深度扫盲】

[复制链接]
发表于 2016-10-21 10:09:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2016-10-21 11:28 编辑

0.jpg


在前面,不二简单介绍了信号与槽机制,没错,点我你就被弹飞啦

很简单的描述性介绍,虽然不是很了解其中理论基础,但并不影响我们使用这个机制。

这次,咱们好好唠唠关于这个Qt里最牛x的核心机制~~~

当然了,有兴趣的可以自行查看“Signals & Slots”关键字。

不二这次,把更深度的理论知识,一起分享下~

有不对的,你就说嘛~不要害羞!

好了,开始唠

信号和槽进行关联使用的是QObject类的connect()函数,一起看下原型长啥样子

QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection) [static]


是不是很帅气~

信号和槽用于两个对象之间的通信,信号和槽机制是Qt不同于其他开发框架的最突出特征!!!

在GUI编程中,当改变了一个部件时,总希望其他部件也能了解该变化,怎么办?

再换一种通俗说法

我们希望任何对象都可以对其他对象进行通信,怎么办?

别想歪了

例如,如果用户单击关闭按钮,希望关闭窗口,咋办?

为了实现这个交互通信过程,一些工具包使用了回调(callback)机制,而在Qt中使用了信号和槽来进行通信。

当一个特殊的事件发生时便可以发射一个信号,比如按钮被双击;

而槽就是一个函数,他在发射信号后被调用来响应这个信号。

Qt的部件类中已经定义了一些信号和槽,但更多的做法是子类化这个部件,然后添加自己的信号和槽来实现想要的功能。

前面使用过的信号和槽都是一个信号对应一个槽。

其实,一个信号可以关联多个槽函数!(看最上面那幅神图你就理解了)

甚至,一个信号还可以关联到另一个信号上哦~

如果存在多个槽与某个信号相关联,那么

当这个信号被发射时,这些槽会依次执行。

但是记住,这个执行顺序是随机滴!

无法指定顺序,所以不建议一个信号关联大于3个槽函数。

讲到现在,就可以解释这个最上面的函数原型了!

他的第一个参数为发送信号的对象

第二个参数为要发送的信号。

第三个参数是接收信号,常用this,表明本部件。

第四个参数是要执行槽。

对于信号和槽

必须要使用SIGNAL()和SLOT()宏!

必须要使用SIGNAL()和SLOT()宏!!

必须要使用SIGNAL()和SLOT()宏!!!


他们可以将其参数转换为const char *类型。

connect()函数的返回值为bool类型,当关联成功时返回true。

注意:

在调用函数的信号和槽只能有类型!不能有变量!

例如:SLOT(show_Value(int 250))

你就真是250了。。。

另一个注意:

信号中的参数类型要和槽中的参数类型相对应,信号中的参数可以多于槽中的参数,但不能反过来!!!

如果信号中有多余的参数,他们会被自动忽略的。

最后一个:

这次不是注意了,只是说明

函数的最后一个参数表明了关联的方式,点我弹过去看介绍~

一般默认值,emit,后面的例子回见到。

但也可以将其参数改为Qt::DirectConnection。

发射完信号立即执行槽,只有槽执行完成返回后,发射信号处后面的代码才可以执行~

O了,就酱~






本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-21 10:51:53 | 显示全部楼层
要不要这么精简。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-21 11:00:49 | 显示全部楼层
wei_Y 发表于 2016-10-21 10:51
要不要这么精简。

刷新。。。还没写完呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 13:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表