信号和槽

来源:互联网 发布:java按键监听器 编辑:程序博客网 时间:2024/05/29 09:40

一. 信号(signal)

当对象的状态发生改变时,信号被某一个对象发射(emit),只有定义过这个信号的类或者其派生类能够发射这个信号。

当一个信号被发射时,与其相关联的槽将被执行,就象一个正常的函数调用一样。

信号-槽机制独立于任何GUI 事件循环。只有当所有的槽正确返回以后,发射函数(emit)才返回

如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地被执行,但是它们执行的顺序将会是不确定的,并且我们不能指定它们执行的顺序。

注意,信号和槽函数的声明一般位于头文件中,同时在类声明的开始位置必须加上Q_OBJECT 语句,这条语句是不可缺少的,它将告诉编译器在编译之前必须先应用moc 工具
进行扩展。关键字signals 指出随后开始信号的声明,这里signals 用的是复数形式而非单数,siganls 没有public、private、protected 等属性,这点不同于slots。另外,signals、slots 关键字是QT 自己定义的,不是C++中的关键字。

还有,信号的声明类似于函数的声明而非变量的声明,左边要有类型,右边要有括号,如果要向槽中传递参数的话,在括号中指定每个形式参数的类型,当然,形式参数的个
数可以多于一个。

从形式上讲,信号的声明与普通的C++函数是一样的,但是信号没有定义函数实现。另外,信号的返回类型都是 void,而C++函数的返回值可以有丰富的类型。

二. 槽(slot)

槽是普通的C++成员函数,可以被正常调用,不同之处是它们可以与信号( signal)相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值

槽也和普通成员函数一样有访问权限。槽的访问权限决定了谁可以和它相连。通常,槽也分为三种类型,即public slots、private slots 和protected slots。

此外,槽也能够声明为虚函数。

三. 信号与槽的关联

槽和普通的C++成员函数几乎是一样的-可以是虚函数;可以被重载;可以是共有的、保护的或是私有的,并且也可以被其它C++成员函数直接调用;还有,它们的参数可以是任意类型。唯一不同的是:槽还可以和信号连接在一起,在这种情况下,每当发射这个信号的时候,就会自动调用这个槽。

connect() 语句看起来会是如下的样子:
connect(sender,SIGNAL(signal),receiver,SLOT(slot));

(1) 一个信号可以连接多个槽
connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int)));
connect(slider,SIGNAL(valueChanged(int)),this,SLOT(updateStatusBarIndicator(int)));
在发射这个信号的时候,会以不确定的顺序一个接一个的调用这些槽。

(2)多个信号可以连接同一个槽
(3)一个信号可以与另外一个信号相连接

connect(lineEdit,SIGNAL(textChanged(const Qstring &)),this,SIGNAL(updateRecord(const Qstring &)));

(4)连接可以被移除
disconnect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError()));

(5)要把信号成功连接到槽(或者连接到另外一个信号),它们的参数必须具有相同的顺序和相同的类型
connect(ftp,SIGNAL(rawCommandReply(int,const QString &)),this,SLOT(processReply(int,const QString &)));

(6)如果信号的参数比它所连接的槽的参数多,那么多余的参数将会被简单的忽略掉
connect(ftp,SIGNAL(rawCommandReply(int,const Qstring &)),this,SLOT(checkErrorCode(int)));

0 0
原创粉丝点击