QT signals and slots, the use of Lambda expressions

QT signals and slots, the use of Lambda expressions


Through the signal and slot mechanism, the communication between the two windows is realized
mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include<QPushButton>
#include"subwidget.h"
class MainWidget : public QWidget
{
    
    
    Q_OBJECT
public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
void MySlot();
void ChangeWin();
void dealSub();
void dealSlot(int , QString);
private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;

    SubWidget w;
};
#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"
#include<QPushButton>
#include<QDebug>//打印

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

    b2 = new QPushButton(this);
    b2->setText("abc");

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

     /*自定义槽,普通函数的用法
      * Qt5:任意的成员函数,普通全局函数,静态函数
      * 槽函数需要和信号一致(参数,返回值)
      * 由于信号都没有返回值,所以,槽函数一定没有返回值
      */
    connect(b2,&QPushButton::released,this,&MainWidget::MySlot);
    connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
    /*信号:短信
     * 槽函数:接收短信的手机
     */

    setWindowTitle("老大");
    //this->setWindowTitle("boss");//和上一条代码作用相同

    b3.setParent(this);
    b3.setText("切换到子窗口");
    b3.move(50,50);

   // w.show();//显示子窗口
    connect(&b3,&QPushButton::released,this,&MainWidget::ChangeWin);

    //处理子窗口信号
    void (SubWidget::*funSignal)()=&SubWidget::mySignal;
    connect(&w,funSignal,this,&MainWidget::dealSub);

    void (SubWidget::*testSignal)(int ,QString)=&SubWidget::mySignal;
    connect(&w,testSignal,this,&MainWidget::dealSlot);

    //Lambda表达式,匿名函数对象
    //C++11新增加的特性,加项目文件:CONFIG += C++11
    //Qt配合信号一起使用,非常方便
    QPushButton *b4 =new QPushButton(this);
    b4->setText("Lambda");
    b4->move(150,150);
    int a=10 ,b=100;

    connect(b4,&QPushButton::released,
            //=:把外部所有局部变量、类中所有成员以值方式传递
            //this:类中所有成员以值传递方式
            //&:把外部所有局部变量,引用符号
            //mutable:传递的变量可变
            //存在动态分配变量尽量不用&,可能会出乱码;建议多用=
            [=]()mutable
    {
    
    
        b4->setText("123");
        qDebug()<<"1111111";
        qDebug()<<a<<b;
    }
            );

    resize(400,300);//设置窗口大小
}
void MainWidget::dealSlot(int a, QString str)
{
    
    
    qDebug()<<a<<str.toUtf8().data();
}
void MainWidget::MySlot()
{
    
    
    b2->setText("123");
}
void MainWidget::ChangeWin()
{
    
    
    //子窗口显示
    w.show();
    //主窗口隐藏
    this->hide();
}
void MainWidget::dealSub()
{
    
    
    //子窗口隐藏
    w.hide();
    //主窗口显示
    show();
}

MainWidget::~MainWidget()
{
    
    

}

subwidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include<QPushButton>

class SubWidget : public QWidget
{
    
    
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = nullptr);
    void sendSlot();

signals:
    /* 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用emit MySignal();
     * 信号可以重载
     */
    void mySignal();
    void mySignal(int ,QString);

public slots:
private:
    QPushButton b;
};

#endif // SUBWIDGET_H

subwidget.cpp

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    
    
    this->setWindowTitle("小弟");
    b.setParent(this);
    b.setText("切换到主窗口");

    connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);

    resize(400,300);
}

void SubWidget::sendSlot()
{
    
    
    emit mySignal();
    emit mySignal(250,"woshizichuangkou");
}

Guess you like

Origin blog.csdn.net/weixin_40355471/article/details/108306195