QT信号与槽,Lambda表达式的使用

QT信号与槽,Lambda表达式的使用


通过信号与槽机制,实现两个窗口之间的通信
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");
}

猜你喜欢

转载自blog.csdn.net/weixin_40355471/article/details/108306195