“信号与槽是Qt的一大创新,关联信号和槽可以完成定义某一事件的触发与事件触发后产生的效果等一系列动作。”
目录
一、信号
二、槽
三、连接
一、信号
信号的作用是当事件符合条件时,该信号被发射。在Qt中我们常用到的就是按钮点击事件的触发,他所发出的信号就是clicked(),还有就是lineedit中字符串改变所触发的信号。关于一些控件的信号我这里就不再赘述了,本文主要讲我们自己去定义一些信号怎么去触发。
我们声明信号时只需要在头文件内去声明,信号函数不可以有返回值,而信号的定义由moc自动生成,所以我们并不需要去实例化信号。常用的信号声明基本形式是
signals:
void xxxxx();//不带参数发送
void xxxxx(QString a,int b,...);//带参数发送
我们在头文件内定义好之后,就在我们想要他被触发的位置这样写
void nn()
{
int a = 10;
emit xxxxx();//发射信号
}
这样,我们的信号就发射完成了。
二、槽
槽是当信号被触发后,程序要回调的函数。他的外观就是c++的函数,对于他的定义和其他的c++函数是一样的,但是在头文件中的声明要在slots下面,有三种形式private slots、protected slots、public slots。我们用private slots来举例
private slots:
void yyyyy();//不带参数接收
void yyyyy(QString a,int b,...);//带参数接收
在实例化时就把他当成是c++普通函数对待,只不过槽函数的触发需要去使用信号触发后来调用,而普通函数起源地是主函数。
三、连接
信号与槽使用connect连接起来,一般写在构造函数中就足够。连接时有以下几个特点:
1、一个信号可以连接多个槽
2、一个槽也可以接收多个信号
3、信号可以连接信号,后者信号被前者信号触发
4、带参数时,按照Qt4的规则应将信号和槽的形参类型对应即可,Qt5的写法则没有这种问题。
首先我们看一下Qt4的写法:
//不带参数
connect(sender,SIGNAL(Sender::xxxxx()),receiver,SLOT(Receiver::yyyyy()));
//带参数
connect(sender,SIGNAL(Sender::xxxxx(QString,int,...)),receiver,SLOT(Receiver::yyyyy(QString,int,...)));
Qt5写法(带参数和不带参数写法一样):
connect(Sender::sender,&Sender::xxxxx,Receiver::receiver,&Receiver::yyyyy);