当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。
槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽。
一、槽和信号
connect()函数最常用的一般形式:
connect(sender, signal, receiver, slot);
参数:
sender:发出信号的对象
signal:发送对象发出的信号
receiver:接收信号的对象
slot:接收对象在接收到信号之后所需要调用的函数
eg:
connect(pushButton,SIGNAL(clicked(bool)),MainWindow,SLOT(close()));
注意:信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)。
二、自定义信号槽
eg:
//头文件定义部分
//MainWindow.h
signals:
void signalText(int num); //信号只需要定义不需要实现
public slots:
void recvText(int num);
void printExit();
//源文件部分
void MainWindow::printExit()
{
cout<<"exit---------"<<endl;
emit signalText(50);
}void MainWindow:: recvText(int num);
{
cout<<" num:"<<num<<endl;
}//调用
connect(btn,SIGNAL(clicked(bool)),this,SLOT(printExit()));
connect(this,SIGNAL( signalText(int)),this, SLOT( recvText(int) ));
注意:信号是一个函数声明,返回 void,不需要实现函数代码。
代码逻辑先是将按钮和窗体进行绑定,在按钮发出clicked()信号时,会被窗体接收到,窗体执行相应的printExit()槽函数,而在printExit()函数内部,有emit signalText(50);这样的语句。emit 是 Qt 对 C++ 的扩展,是一个关键字(其实也是一个宏)。emit 的含义就是发出信号。我们将50当做参数传给这个信号。当接收者连接这个信号时,就可以通过槽函数获得实际值。这样就完成了数据从发出者到接收者的一个转移。