吃饭睡觉学QT(4)- 信号重载,Lambda

#include "widget.h"
#include <QPushButton>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("shuaiTT");
    b1.move(100,100);

    b2 = new QPushButton(this);
    b2->setText("pangRR");
    b2->move(200,100);

    connect(&b1,&QPushButton::pressed,this,&Widget::close);
    //  &b1:信号发出者 指针类型
    //  &QPushButton::pressed  处理的信号,  &信号发出者的类名::信号类型
    //  this:信号接收者
    //  &Widget::close   槽函数,信号处理函数


    /* 自定义槽   普通函数的用法*/
    //QT:任意的成员函数,普通全局函数,静态函数
    //   槽函数需要和信号一致
    //   由于信号没有返回值 所以槽函数也没有返回值

    connect(b2,&QPushButton::pressed,this,&Widget::my_slot);

    this->setWindowTitle("baba");

    b3.setParent(this);
    b3.setText("切换待子窗口");
    b3.move(150,200);

   // w2.show();  //显示子窗口
    connect(&b3,&QPushButton::released,this,&Widget::changeWin);  //从父窗口跳到子窗口


    //connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口
    //connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub2);   //重载信号


    //处理信号重载的选择问题的方法(1)(QT5)  函数指针
    void (SubWidget::*funsignal)() = &SubWidget::MySignal;
    connect(&w2,funsignal,this,&Widget::dealsub);//从子窗口跳到父窗口
    void (SubWidget::*funsignal2)(int , QString) = &SubWidget::MySignal;
    connect(&w2,funsignal2,this,&Widget::dealsub2);

    //处理信号重载的选择问题的方法(2)(QT4)


    //Lambda表达式   C++新增的特性,项目文件 CONFIG += C++11  (匿名函数对象)
    //QT配合信号一起使用很方便

    QPushButton *b4 = new QPushButton(this);
    b4->setText("lambda");
    b4->move(250,200);
    int a = 2,b=6;
    connect(b4,&QPushButton::released,
            [=]()  mutable
            // []  :  里面不加任何东西 权限很低
            //[=]  :  外部所有局部变量,类里面所有的成员以值传递方式
            //[this] :  类里面所有的成员以值传递方式
            //[&]  :  引用符号 外部所有局部变量以值传递方式
            //mutable : 本来的权限只是only——read 现在可以改变
            {
                qDebug() << "1111";
                qDebug() << a << b;
            }


            );


    resize(400,300);
}

void Widget::my_slot()
{
    b2->setText("pangRR beauty...");
}

void Widget::changeWin()
{
    //子窗口显示,父窗口隐藏
    w2.show();
    this->hide();
}

void Widget::dealsub()
{
    //父窗口显示,子窗口隐藏
    this->show();
    w2.hide();

}

void Widget::dealsub2(int a , QString str)
{
    qDebug() << a << str.toUtf8().data();
}

Widget::~Widget()
{

}
 

接着上次,利用发射信号处理完了从子窗口跳转到父窗口之后,假如我们碰到了一种信号函数需要重载的情况,该如何实现呢

//connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub);//从子窗口跳到父窗口   

//connect(&w2,&SubWidget::MySignal,this,&Widget::dealsub2);   //重载信号

重载的是MySignal,这个函数 而在子窗口就发射的是两个信号

void SubWidget::sendslot()

{
    emit MySignal();
    emit MySignal(250,"我是帅TT");
}
 

当然不要忘记在头文件中

void MySignal();

void MySignal(int,QString);

 

那么重点来了,有两个信号,父窗口怎么去判断接受哪个信号,在这里,最新的方法是用函数指针

void (SubWidget::*funsignal)() = &SubWidget::MySignal;   

connect(&w2,funsignal,this,&Widget::dealsub);//从子窗口跳到父窗口   

void (SubWidget::*funsignal2)(int , QString) = &SubWidget::MySignal;   

connect(&w2,funsignal2,this,&Widget::dealsub2);

然后在类里面编辑这两个函数的作用。

本来在学习的过程中还提到了Qt4里面一个方法,但是不知道什么原因一直没有能实现,但是这个方法有一个弊端,需要在头文件中将槽函数改为public slots

 

 

 

 

 

对于这个connect函数,QT中还有一个更好的Lambda表达式,用起来很方便

QPushButton *b4 = new QPushButton(this);   

b4->setText("lambda");   

 b4->move(250,200);   

 int a = 2,b=6;   

connect(b4,&QPushButton::released,

            [=]()  mutable           

      // []  :  里面不加任何东西 权限很低           

            //[=]  :  外部所有局部变量,类里面所有的成员以值传递方式          

            //[this] :  类里面所有的成员以值传递方式           

            //[&]  :  引用符号 外部所有局部变量以值传递方式           

            //mutable : 本来的权限只是only——read 现在可以改变

            {

                qDebug() << "1111"; 

                qDebug() << a << b;

            }

            );

如果想用这个表达式 不能忘记需要在工程文件中加入一个  CONFIG += C++11

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值