Qt信号槽主要用来解决多窗口之间数据传值的问题,这里我们先来聊聊信号和槽函数;
这里slots表示槽,signals表示信号。
这里emit表示将信号发送,由此知道pressBtn每执行一次将会发送一次信号;对于何时执行pressBtn函数,那边是使用我们之前表明的按钮了,使用connect将按钮与pressBtn函数绑定在一起,其实在我们点击按钮时便实现了一次信号的发送与接收,只不过这是Qt内部集成在按钮事件上了而已,不需要我们来做具体的实现,在我们点击按钮时发送了一个按钮点击的信号,而程序自身接收之后便会执行按钮绑定的执行函数。
receiveData便是接收槽。
而receiveData接受槽函数便是按照自己的功能来实现便可:
这样我们便实现了最初预期的效果。
信号槽分为信号和槽函数:
- 信号:是一个函数,这个函数不需要实现,只声明便可以,使用signals关键字限定;
函数返回值:void;
函数可重载,主要是便于针对不同传递界面单次传递数据数量不同;
单个信号可连接多个槽,用于将一方的数据传递到多个界面;
多个信号可连接一个槽,用于一方接收多个界面的数据以整合;
- 槽函数:槽函数为类中的成员函数,自己定义与声明;
函数返回值:void;
函数可重载(这里未避免对C++不熟悉,解释下重载的感念,重载就是两个或多个函数函数名相同,入参个数各不相同);
参数需要与信号的参数一一对应,槽函数的参数个数只可小于或等于信号的参数个数,不可大于;
下面正式进入信号槽的伪代码实现:
我们以两个界面之间数据传递为例,同时定义一个Qt Widget项目,对应的存在两个成组存在的.cpp、.h文件(自己命名吧,这里我们以MainWindow,form为两个界面命名);
我们要实现一个简单的demo,在form中的Edit上输入文本,点击按钮会在MainWindow界面上显示输入的文本。
那么按照信号槽的原理,我们需要在form.h中声明信号,并写一个信号发送时间的一个函数(发送触发函数):
public slots:
void pressBtn();
signals:
void sendData(QString data);
因为信号只需声明,那么在form.cpp中只需要实现pressBtn槽函数:
void Form::pressBtn()
{
emit sendData(ui->lineEdit->text());
}
接下来便是实现信号的接收了,首先在MainWindow.h中声明:
private:
Form* Fm;
public slots:
void receivData(QString data);
信号槽最主要的便是接下来的信号与槽之间的绑定,方式类似按钮与执行函数之间的绑定:
Fm = new Form();
connect(Fm,SIGNAL(sendData(QString)),this,SLOT(receivData(QString)));
void MainWindow::receivData(QString data)
{
ui->label->setText(data);
}
附上我的完整的项目代码吧(这里我就用图片来展示吧
)。
ok,信号槽机制到此结束,下次Get到新知识再来。