QT+lambda 表达式

Posted doker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT+lambda 表达式相关的知识,希望对你有一定的参考价值。

#include "mainwidget.h"

#include <QPushButton>

#include <QDebug>
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)


//    QPushButton btn1;
//    QPushButton btn2;

    btn1.setParent(this);
    btn1.setText("colse");
    btn1.move(100,100);


    btn2 = new QPushButton(this);//指针没有空间,是需要动态的对其进行空间的分配
    btn2 ->setParent(this);
    btn2 ->setText(" 3 2 1 ");

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

    /* 对connect的说明:
     * &btn1 :信号发出着,指针类型
     * &QPushButton::pressed:处理信号,  &发送者的类名::信号名字
     * this:信号接收者
     * &MainWidget::close:   槽函数,信号处理函数 &接收者的类名::槽函数名字
    */


    /*自定义槽,说的更加通俗一点,就是普通函数的用法
     * QT5:可以是 任意的成员函数(常用这种方法,直接写成该类的成员函数),普通全局函数,静态函数  都可以是槽函数
     * 槽函数需要和信号一致(参数,返回值)
     * 由于信号都是没有返回值,所以,槽函数一定没有返回值
    */
    //释放按钮btn2实现里面的文本内容发生改变
    connect(btn2,&QPushButton::released,this,&MainWidget::mySlot);//在写自定义信号槽函数的时候,一定要看发送信号函数的类型,这里released信号的函数是:void QAbstractButton::released()
                                                //即released函数没有参数,也没有返回值,槽函数需要和信号一致,也没有参数和返回值

    //释放按钮btn2隐藏按钮btn1
    connect(btn2,&QPushButton::released,&btn1,&QPushButton::hide);

    //互相切换窗口的小游戏
    this->setFixedSize(360,480);
    this ->setWindowTitle("苍老师");
    btn3.setParent(this);
    btn3.setText("换到波老师");
    btn3.move(50,50);


    //显示子窗口
//    w.show();

    //点击按钮btn3实现主窗口隐藏,子窗口显示
    connect(&btn3,&QPushButton::released,this,&MainWidget::changeWin);

    //处理子窗口发送过来的信号
    void (SubWidget::*funSognal)() = &SubWidget::mySignal;
    connect(&w,funSognal,this,&MainWidget::dealWin);
    //处理子窗口发送过来的信号(有参数)
    void (SubWidget::*testSognal)(int ,QString) = &SubWidget::mySignal;
    connect(&w,testSognal,this,&MainWidget::subSlot);


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

    QPushButton *btn6 = new QPushButton(this);//这里就不能使用普通的变量,而要使用指针变量,不然是局部变量会释放
    btn6->setText("lambda表达式");
    btn6->move(150,150);
    int a= 1,b=100;
    //这里的的=的意思是:把外部所有的局部变量、类中所有成员以值传递方式传递进来,唯一不足的是其传递进来的值以只读的方式进来
    //this:类中所有成员以值传递方式传递进来
    //&:把外部所有的局部变量 引用符号(慎用:在有类似动态创建空间的时候,值容易被破坏)
    //如果在大括号内部想对传递进来的值进行修改,需要在()后添加mutable关键字
    connect(btn6,&QPushButton::released,[=]()mutable 

        qDebug()<<"1231213213231213";
        qDebug()<<a<<b;
        a=10;
    );
    //当使用有参数的信号函数时,例如使用clicked;

    connect(btn6,&QPushButton::clicked,[=](bool isChecked) 

        qDebug()<<isChecked;

    );














//自定义槽函数的实现
void MainWidget::mySlot()

    btn2->setText("I LOVE YOU");


void MainWidget::changeWin()

    //子窗口显示,
    w.show();
    //本窗口隐藏
    this ->hide();


void MainWidget::dealWin()

    //子窗口隐藏
    w.hide();
    //本窗口显示
    this->show();


void MainWidget::subSlot(int a,QString str)

    qDebug()<<a<<str;

MainWidget::~MainWidget()


 

以上是关于QT+lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu下对Qt工程进行deb打包发布

Qt5中的lambda表达式和使用lambda来写connect

QT+lambda 表达式

IntelliJ:求值lambda表达式在调试时引发编译错误

qt 5信号和槽的新形式,附带lambda表达式在这里的应用(偷懒的神器) qt官方蓝牙的btcha这个demot的个人解读

使用 lambda 表达式连接 pyqt 中的插槽