QT——信号和槽

概念

1.作用:用于在QT的图形控件见传递参数

2.查看控件的槽函数或者信号函数

f1两次看中断的帮助文档,看public function 和public slot (槽)

QT——信号和槽_第1张图片

点父类QT——信号和槽_第2张图片

找singal(信号)

QT——信号和槽_第3张图片

让按钮有反应加上信号和槽:找singal函数

3.信号的条件

/*信号必须有signals关键字来声明

     * 信号没有返回值,但可以有参数

     * 信号就是函数的声明,只需声明,无需定义

     * 使用:在前面加emit emit mySignal()

     * 信号可以重载

     */

 

注意

①发射信号和跳转时候必须有两个窗口类都初始化了,不能只有一个窗口类声明而另一个没有声明,这样未声明的窗口接收不到信号。

 

应用

1.connect函数(设置按钮按下时候关闭程序窗口)

connect(&b1,&QPushButton::pressed,this,&MainWidget::close);

    connect(&b1,&QPushButton::pressed,this,&MainWidget::close);

    /* &b1:信号发出者,指针类型

     * &QPushButton::pressed:处理的信号, &发送者的类名::信号名字

     * this:信号接受者

     * &MainWidget::close :槽函数,信号处理函数 &接收者的类名::槽函数名字

*/

2.connect函数(b2按钮释放时候隐藏b1)

connect(b2,&QPushButton::released,&b1,&QPushButton::hide);

//注意处理好谁发送谁处理

3.信号重载时候的使用

信号有多少个参数,槽函数也必须有多少个参数。信号参数类型是什么,槽函数也必须是什么。信号带参数的目的是给槽函数传参。

若信号出现重载,会产生二义性,不知道调用哪个信号,需要分别定义一个指向函数的指针标识他们。与2的区别是需要加上一个作用域,声明是哪个SubWidget::的子函数。

    void (SubWidget::*funSignal)()=&SubWidget::mySignal;//不带参数

    connect(&w,funSignal,this,&MainWidget::dealSub);

 

    void (SubWidget::*testSignal)(int,QString)=&SubWidget::mySignal;

    connect(&w,testSignal,this,&MainWidget::dealSlot);

(回顾C++):若有一个函数名为void fun(int x),要声明一个指针指向fun,则void (*p)(int)=fun;

 

 

自定义槽函数

1.定义/*自定义槽,普通函数的用法

               *QT5:任意的成员函数,普通全局函数,静态函数

               * 槽函数需要和信号一致(参数,返回值)

               * 由于信号都是没有返回值,所以槽函数一定会没有返回值

               */

2.实现:

①在头文件加自定义的槽函数声明:void mySlot();QT——信号和槽_第4张图片

②填写自定义的函数,以及连接信号和槽:

QT——信号和槽_第5张图片

③设置按钮点击抬起后更改按钮显示的内容:connect(b2,&QPushButton::released,this,&MainWidget::mySlot);

QT——信号和槽_第6张图片

connect(b2,&QPushButton::released,this,&MainWidget::mySlot);//用成员函数写

 

lambda表达式

1.配置需要在项目文件中: CONFIG += C++11

QT——信号和槽_第7张图片

2.方便之处:不用定义槽函数不用指定信号接收者

3.传参的解释

①使用:

connect(b4,&QPushButton::released,
            []()
            {
               qDebug() << "111111";

            }

            );

②[]的作用:把外部变量传进来

connect(b4,&QPushButton::released,
            [b4]()
            {
               b4->setText("123");
               qDebug() << "111111";

            }

            );

③一次传多个变量: 用=号:把本函数中所有局部变量、本类中所有成员以值传递

connect(b4,&QPushButton::released,
            [=]()
            {
               b4->setText("123");
               qDebug() << "111111";

            }

            );

④其他传参方法:

            // = :把本函数中所有局部变量、本类中所有成员以值传递

            // this :类中所有成员以值传递

            // & : 把外部所有局部变量,引用符号

&又可能会出现内存问题,用=不会

⑤想要修改参数怎么做:加mutable关键字 :

QT——信号和槽_第8张图片

4.设置lambda表达式返回值:(int)

connect(b4,&QPushButton::released,
            []()-> int 
            {
               qDebug() << "111111";
               return 1;

            }

            );

 

使用界面设置信号和槽

使用界面连接:

 

连接界面的控件连接

用ui->控件名来使用

你可能感兴趣的:(QT,QT_summary,singal_slot)