Qt学习篇(一):Qt信号槽机制

       Qt信号槽主要用来解决多窗口之间数据传值的问题,这里我们先来聊聊信号和槽函数;

       信号槽分为信号和槽函数:
  • 信号:是一个函数,这个函数不需要实现,只声明便可以,使用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);
这里slots表示槽,signals表示信号。
       因为信号只需声明,那么在form.cpp中只需要实现pressBtn槽函数:
void Form::pressBtn()
{
    emit sendData(ui->lineEdit->text());
}
这里emit表示将信号发送,由此知道pressBtn每执行一次将会发送一次信号;对于何时执行pressBtn函数,那边是使用我们之前表明的按钮了,使用connect将按钮与pressBtn函数绑定在一起,其实在我们点击按钮时便实现了一次信号的发送与接收,只不过这是Qt内部集成在按钮事件上了而已,不需要我们来做具体的实现,在我们点击按钮时发送了一个按钮点击的信号,而程序自身接收之后便会执行按钮绑定的执行函数。
       接下来便是实现信号的接收了,首先在MainWindow.h中声明:
private:
    Form* Fm;

public slots:
    void receivData(QString data);
receiveData便是接收槽。
       信号槽最主要的便是接下来的信号与槽之间的绑定,方式类似按钮与执行函数之间的绑定:
Fm = new Form();
connect(Fm,SIGNAL(sendData(QString)),this,SLOT(receivData(QString)));
而receiveData接受槽函数便是按照自己的功能来实现便可:
void MainWindow::receivData(QString data)
{
    ui->label->setText(data);
}
这样我们便实现了最初预期的效果。

附上我的完整的项目代码吧(这里我就用图片来展示吧Qt学习篇(一):Qt信号槽机制)。
Qt学习篇(一):Qt信号槽机制
Qt学习篇(一):Qt信号槽机制
Qt学习篇(一):Qt信号槽机制
Qt学习篇(一):Qt信号槽机制
ok,信号槽机制到此结束,下次Get到新知识再来。