对信号与槽的一点学习总结

来源:互联网 发布:外国人用淘宝 编辑:程序博客网 时间:2024/05/14 04:00

             最近学习了Linux的高编和网络编程,在Linux中敲代码和之前在QT中敲的感觉是不一样的,因为QT好多函数都已经封装好了,只要了解这个函数是干嘛用的,函数里的参数是什么就可以了,非常的方便,在学习QT的时候,老师曾说过,如果不会用信号与槽,那就不能说自己学过QT,为什么呢,因为QT中大量的运用了信号与槽,来实现大部分功能,所以可以说信号与槽就是QT的精髓,下面我将对信号与槽进行一下总结。

             首先简单回顾一下什么是信号、什么是槽。信号一般是用来传参或者是一种逻辑的调用者。槽 :是用来接收信号,并且完成信号想要实现的功能。所以可以看出,信号与槽是一种高级接口,实现对象之间的通信。

</pre><p>        用一个小例子来阐述信号与槽的基本使用。  </p><p>             1.如何声明信号与槽:代码如下</p><p>         </p><pre class="cpp" name="code">#ifndef MYSIGNAL_H#define MYSIGNAL_H#include <QWidget>namespace Ui {class Mysignal;}class Mysignal : public QWidget{    Q_OBJECTpublic:    explicit Mysignal(QWidget *parent = 0);    ~Mysignal();signals:    void signalsend();private slots:    void receivesignal();    void on_lineEdit_returnPressed();    void receivesignal2();private:    Ui::Mysignal *ui;};#endif // MYSIGNAL_H


 能看出哪一句是声明信号的吗?没错,就是signals:
                                                                              void signalsend();  这句。


       private slots:   
                        void receivesignal();
                        void on_lineEdit_returnPressed();
                        void receivesignal2();                            这三句则是用来声明槽函数的。槽函数必须要有函数体,而信号只需要声明即可不需要写函数体。

                2.信号和槽函数的连接。

代码如下:

#include "mysignal.h"#include "ui_mysignal.h"Mysignal::Mysignal(QWidget *parent) :    QWidget(parent),    ui(new Ui::Mysignal){    ui->setupUi(this);    connect(this,SIGNAL(signalsend()),SLOT(receivesignal()));     connect(this,SIGNAL(signalsend()),SLOT(receivesignal2()));}Mysignal::~Mysignal(){    delete ui;}void Mysignal::on_lineEdit_returnPressed(){    emit signalsend();}void Mysignal::receivesignal(){    ui->textEdit->setText("这是第一个接收信号的槽"+ui->lineEdit->text());}void Mysignal::receivesignal2(){    ui->lineEdit_2->setText("这是第二个接收信号的槽"+ui->lineEdit->text());}



                  ①.转到槽。转到槽应用的比较多,因为只需要右键创建,一般用到pushbutton的时候往往配合转到槽来进行对象之间的通信。 这里首先将lineEdit 转到槽,槽有很多选项,这里我们选用returnPress();这个槽函数的效果就是你按回车键就可以完成输入。那么我们在槽函数里主要做一件事情,就是发送一个信号:发送信号要用emit +之前声明定义的信号,即emit signalsend();

                  ②.连接槽函数。使用connect语句进行连接,connect(this,SIGNAL(signalsend()),SLOT(receivesignal()));

                                                                                        connect(this,SIGNAL(signalsend()),SLOT(receivesignal2()));

                      需要说一下connect()括号中的参数,第一个参数this是对象指针,this就是指当前你正在使用的这个类的对象指针,如果说你的信号和槽在同一个类里面,那么第三个参数就可以不再声明this。第二个参数是信号,第四个参数是槽,需要注意的事关键字SIGNAL,SLOT都需要大写。

                 ③.构建槽函数。这里我们将一个信号连到两个槽中,所以要写两个槽函数,并且在头文件中需要声明。(一个信号可以连接一个或者多个槽函数,一个槽函数也可以被多个信号来连接,这些都是可以的。)

                 在槽函数体内,做了一下简单的处理,将lineEdit中的内容传递到textEdit 和lineEdit2中去,这样当你写一些字进去按回车就可以在textEdit 个lineEdit2中显示了,这是两个不同的组件,却是由一个信号来激发产生的。



               下面在将这个过程简单捋顺一下:首先在页面中的lineEdit中打字,然后按回车,lineEdit的槽函数中发送一个信号给textEdit和lineEdit,告诉它们,现在需要你们两个槽函数干活了,当两个槽函数收到这个信号后,开始执行槽函数内部的程序,即将lineEdit中的文字set到textEdit中和lineEdit2中,这样就完成了这个小例子的全部内容

               总结:   ①   当一个信号连接多个信号槽时,槽函数会被调用,但是哪个槽函数先被执行呢?答案是随机的。

                             ②   当多个信号连接到同一个槽函数时,任何一个信号发出emit,槽函数都会被执行。

                             ③   当不需要信号与槽连接的时候可以断开连接,用disconnect();如上例中,如果想将sendsignal 与receivesignal断开的话,可以写成

                                         disconnect(this,SIGNAL(sendsignal()),SLOT(receivesignal()));这样你再按回车,lineEdit中的数据也不会显示到lineEdit2和textEdit中去了。 

                                     另外有几种情况必须使用diconnect()函数:1.断开与某个对象相关联的任何对象。

                                                                                                               2.断开与某个特定信号的任何关联。

                                                                                                               3.断开两个对象之间的关联。       

               

          

             

              经过一系列的学习,从一开始的一知半解,到现在的熟练掌握,汇文的宋老师给予了我很多的帮助,有不懂得可以去看一下网址  www.huiwen.com点击打开链接

 


         


0 0
原创粉丝点击