QT实战(4):Lambda表达式以及带参数的信号和槽

 在(3)的基础上改进,主文件main.cpp没有变化。新添加的是带参的信号槽 以及Lambda的解决方式。

//mainwidget.h 
#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include 
#include 
#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 subWin;
};

#endif // MAINWIDGET_H
//mainwdget.cpp  主窗口的操作
#include "mainwidget.h"
#include 
#include    //打印
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText("CLOSE!");
    b1.move(100,100);

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

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

    /*自定义slot,即普通函数
     * QT5任意的成员函数,普通全局函数,静态函数
     * slot函数需要和信号一致(参数,返回值)
     * 由于信号没有返回值,所以槽slot函数也没有返回值
    */
    connect(b2, &QPushButton::released, this, &MainWidget::mySlot); //mySlot是类的成员函数
    connect(b2, &QPushButton::released, &b1, &QPushButton::hide);

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

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

    connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);

    //处理子窗口的信号
    void (SubWidget::*funSignal) ()= &SubWidget::mySignal; //不带参函数指针
    connect(&subWin,funSignal,this,&MainWidget::dealSub);

    void (SubWidget::*testSignal) (int,QString)= &SubWidget::mySignal; //不带参函数指针
    connect(&subWin,testSignal,this,&MainWidget::dealSlot);

    //Lambda 表达式,即匿名函数对象
    //C++11增加的新特性,项目文件  CONFIG += C++11
    QPushButton *b4 = new QPushButton(this);
    b4->setText("Lamba 表达式");
    b4->move(150,150);
    connect(b4,&QPushButton::clicked,  //clicked信号有一个默认参数,下面的isCheck和它对应

            //如果写成[=],就是把外部局部变量、类中所有成员以值传递,不用一个个写。
            //如果写成[this],类中所有成员以值传递,不用一个个写。
            //如果写成[&],把外部局部变量引用进来,不用一个个写。
            [b4](bool isCheck) mutable    //mutable关键字表示传进来的值可以被修改
            {
                b4->setText("[]就是传外部变量");
                qDebug()<字节数组QByteArray
    //str.toUtf8.data()  -> QByteArray -> char *
    qDebug()<setText("123");
}

void MainWidget::changeWin(){
    //子窗口显示
    subWin.show();
    //本窗口隐藏
    this->hide();
}

void MainWidget::dealSub(){
    //主窗口显示
    this->show();
    //子窗口隐藏
    subWin.hide();
}

MainWidget::~MainWidget()
{

}


//subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include 
#include 

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("solider");
    b.setParent(this);
    b.setText("切换到主窗口");

    connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);
    resize(400,300);
}

void SubWidget::sendSlot(){
    emit mySignal();
    emit mySignal(250,"我是子窗口");
}

 

你可能感兴趣的:(QT)