04_Qt信号与槽机制


当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号
signal。这种发出是没有目的的,类似广播。
如果有对象对这个信号感兴趣 ,它就会使用连接 connect函数,意思是,将想要 处理的信号和自己的一个函数为槽 slot绑定来处理这个信号。
也就是说,当信号发出时,被连接的槽函数会自动被回调。

一、信号和槽

1.1、Qt5的书写方式

connect(&b1,&QPushButton::pressed,this,&Widget::close);
/* &b1:信号发出者,指针类型
 * &QPushButton::pressed:处理的信号, &发出者的类名::信号名字
 * this:信号接受者
 * &Widget::close:槽函数,信号处理函数  &发出者的类名::信号名字
 */
1.1.1、处理子窗口的信号不带参数

注意这样会产生二义性

connect(&subWin,&SubWideget::mySignal,this,&Widget::dealSub);
connect(&subWin,&SubWideget::mySignal,this,&Widget::dealSlot);
1.1.2、处理子窗口的信号带参数(使用函数指针)
void (SubWideget::*funSignal)() = &SubWideget::mySignal;
connect(&subWin,funSignal,this,&Widget::dealSub);

void(SubWideget::*testSignal)(int,QString) = &SubWideget::mySignal;
connect(&subWin,testSignal,this,&Widget::dealSlot);

1.2、Qt4的书写方式

Qt4信号连接:

  1. 使用了LSIGNAL和TSLOT这两个宏,将两个函数名转换成了字符串。
  2. 不方便检查错误

格式:connect(信号的发出者(指针类型), 处理的信号(SIGNAL(信号名字)), 信号的接受者, 信号处理的函数(SLOT(槽函数)));

connect(&subWin,SIGNAL(mySignal()),this,SLOT(dealSub()));  //不带参数
connect(&subWin,SIGNAL(mySignal(int,QString)),this,SLOT(dealSlot(int,QString))); //带参数

1.3、Lambda表达式(匿名函数对象)

C++11中添加的新特性,需要在项目文件中添加:CONFIG += C++11
在Qt中配合信号一起使用,非常方便

  1. 不带参数
QPushButton *b4 = new QPushButton(this);
b4->setText("Lambda表达式");
b4->move(400,300);
int a =10,b=100;
connect(b4,&QPushButton::released,
            //[]里面可以传一个变量也可以传多个变量 [b4,a,b]
            //=:把外部所有的局部变量、类中所有成员以值传递方式
            //this :类中所有成员以值传递方式
            //&:把外部所有局部变量,引用符号
            [=]()
            {
                b4->setText("123");
                qDebug()<<"你好";
                qDebug()<<a<<b;
            }
            );
  1. 带参数
connect(b4,&QPushButton::clicked,
            [=](bool isCheck)
            {
                qDebug()<<isCheck;
                qDebug()<<a<<b;

            }
            );

二、自定义信号槽

2.1、信号

  1. 信号必须有singnals关键字来声明
  2. 信号没有返回值,但可以有参数
  3. 信号就是函数的声明,只需声明,无需定义
  4. 使用emit在恰当的位置发信号
  5. 信号可以重载
signals:
    void mySignal();
    void mySignal(int,QString);//QString是Qt中的字符串

2.2、槽

  1. 槽函数是普通函数,作为成员函数,会受到public,private,protected的影响
  2. 槽函数需要和信号一致(参数和返回值)
  3. 由于信号没有返回值,则槽函数也没有返回值
  4. 任意成员函数,普通全局函数,静态函数,Lambda表达式都可以作为槽函数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值