不二如是 发表于 2016-10-21 10:09:37

101-信号和槽机制-Qt核心-【深度扫盲】

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



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

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

这次,咱们好好唠唠关于这个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)

是不是很帅气~

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

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

再换一种通俗说法

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

别想歪了{:10_297:}

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

为了实现这个交互通信过程,一些工具包使用了回调(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了,就酱~{:9_223:}






wei_Y 发表于 2016-10-21 10:51:53

{:10_250:}要不要这么精简。

不二如是 发表于 2016-10-21 11:00:49

wei_Y 发表于 2016-10-21 10:51
要不要这么精简。

刷新。。。还没写完呢{:10_254:}
页: [1]
查看完整版本: 101-信号和槽机制-Qt核心-【深度扫盲】