QT5之lambda+内存回收机制

使用lambda需要 配置c++11

所以在点.pro文件里面配置添加如下

CONFIG +=c++11

使用到qDebug 打印包含头文件

#include<QDebug>

lambda 表达式使用 代替槽如下

#include "mainwidget.h"
#include<QPushButton>
#include<QDebug>
mainWidget::mainWidget(QWidget *parent)
    : QWidget(parent)
{
   b1.setParent(this);//this 是这个窗口。就是main函数构造的w
   b1.setText("close");
   b1.move(100,100);

   b2 = new QPushButton(this);//新建个空间给b2指针
   b2->setText("send");
//   connect(&b1,&QPushButton::pressed,this,&mainWidget::close   );
   //按键(信号发出者) ,按键发出者的类 ::(作用域)类的函数(发送的信号),接收者(窗口),接收动作类+作用域+函数(槽函数)
   connect(b2,&QPushButton::pressed,this,&mainWidget::myslot);
   //按键(信号发出者) ,按键发出者的类 ::(作用域)类的函数(发送的信号),接收者(窗口),控件类+作用域+函数(槽函数)
   connect(b2,&QPushButton::pressed,&b1,&mainWidget::hide);//hide 隐藏
   //按键(信号发出者) ,按键发出者的类 ::(作用域)类的函数(发送的信号),接收者(按键),控件类+作用域+函数(槽函数)


   this->setWindowTitle("老大");
   b3.setParent(this);
   b3.setText("切换到子窗口");
   b3.move(50,50);
   connect(&b3,&QPushButton::released,this,&mainWidget::changwindow);//按钮 和槽的联系
  // w.show();
   void (subwidget::*p_not)()=&subwidget::mySinal;//依靠类型指针,来区分重载函数;
   connect(&w,p_not,this,&mainWidget::dealsubwindows);//按钮 和槽的联系
   void (subwidget::*p_sinal )(int ,QString)=&subwidget::mySinal;//依靠类型指针(带参),来区分重载函数;
   connect(&w,p_sinal,this,&mainWidget::subwindows_printf);//按钮 和槽的联系


   /*lambda 表达式  c++11 增加的新特性
   *QT配合信号一起使用,非常方便
*/
   QPushButton *b4=new QPushButton(this);//创建一个按钮,指定父对象为this 这个基类窗口
   b4->move(150,150);
   int a=10,b=22;
   connect(b4,&QPushButton::clicked,
           [=](bool click )mutable
                {
                   qDebug()<<click;
                   qDebug()<<"111111";
                   qDebug()<<a<<b;
                   a=99;
                }
           /*[]代表函数的开始 ()函数的带参
            * 括号内可以传参
            *[b4,a,b]如此把指定参数传入
            * [=] 把所有局部变量 类中所有成员以值传递方式传入
            * [this]类中所有成员
            * [&]:把外部所有局部变量,引用符号;(就是符号引用,所以内存基本是没有初始化的,一般不会&)
            * []() mutable  添加关键字传入的值可变
            *
            *clicked 带参 是个flase,所以clicked属于一个信号,且带一个参

*/
           );

   resize(500,500);//设定窗口大小
}

void mainWidget:: myslot()//槽函数的定义,自定义槽
{
    b2->setText("123");//槽函数的函数动作


}

void mainWidget::changwindow()//槽函数处理
{
    this->hide();//关掉mainWidget基类  主窗口
    w.show();//子窗口 显示

}
void mainWidget::dealsubwindows()//槽函数处理
{

    this->show();//打开mainWidget基类  主窗口
    w.hide();//子窗口 关闭

}
void mainWidget::subwindows_printf(int a,QString str)
{
     qDebug()<< a<<str.toUtf8().data();//显示a和str
}
mainWidget::~mainWidget()
{

}

主窗口.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include<QPushButton>//添加按键头文件
#include <QWidget>
#include"subwidget.h"

class mainWidget : public QWidget
{
    Q_OBJECT

public:
    mainWidget(QWidget *parent = 0);
    ~mainWidget();
    void myslot();//声明一个共有 ,自定义一个槽为共有成员
    void changwindow();//添加一个槽 关闭 主窗口 打开子窗口
    void dealsubwindows();//添加一个槽 关闭子 开主窗口
    void subwindows_printf(int a,QString str);//
private:  //添加两个私有成员 按键控件
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;//设置b3按钮

    subwidget w;//添加一个私有为子窗

};

#endif // MAINWIDGET_H

子窗口

c文件

#include "subwidget.h"
#include<QPushButton>
subwidget::subwidget(QWidget *parent) : QWidget(parent)
{

    this->setWindowTitle("小弟");//设置子窗口的标题
    b.setParent(this);//给b指定 父类
    b.setText("返回主窗口");//设置按钮文本

   connect(&b,&QPushButton::clicked,this,&subwidget::sendSlots);//
   //按键 按下 这个基类相应个槽函

     resize(500,500);//限制大小
}

void subwidget::sendSlots()
{

    emit mySinal();//槽里面发送个信号 必须有emit 关键字
    emit mySinal(250,QString("我是子窗口"));//发送带参信号
}

h文件

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include<QPushButton>//

class subwidget : public QWidget
{
    Q_OBJECT
public:
    explicit subwidget(QWidget *parent = 0);
    void sendSlots();//槽函数,响应按钮,发送信号
signals:
     /*信号必须有signals 关键字来声明
      * 信号没有返回值,但可以有参数
      * 信号就是函数的声明,只需声明,无需定义
      * 使用:emit mySignal();
      * */
    void mySinal();
    void mySinal(int,QString);//qT的字符串类型 QString
    /*信号名字已经相同,所以信号重载
     * 有重载的信号,需要用函数指针;
     * 用重载的信号,只能用指针
     * */
public slots:
//新加的窗口 私有成员 按键 b
private:
    QPushButton b;


};

#endif // SUBWIDGET_H

内存回收机制实验

添加文件

添加个基类为qwidget的文件;

构造函数中:

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)//这个的作用就是为构造函数传传参数 ,这个是通过参数列表的方式
{
}

本实验的实验内容:

 自己定义一个子类按钮,基类为QPushButton

  在程序结束的时候看到打印了被析构,就是内存已经释放;

ps:析构函数,就是被释放的时候执行;

mybutton.h文件继承QpushButton的按钮.h文件

mybutton 继承于QpushButton

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>//把基类从Qwidget 改成QPushButton

class MyButton : public QPushButton //把基类从Qwidget 改成QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = 0);
    ~MyButton();//添加析构函数
signals:

public slots:
};

#endif // MYBUTTON_H

mybutton.cpp文件

#include "mybutton.h"
#include <QDebug>//添加打印函数的头文件

MyButton::MyButton(QWidget *parent)
    : QPushButton(parent)//通过参数列表的方式,给构造函数传参;传递的类型的为QPushButton,同时也是父类
{

}

MyButton::~MyButton()
{
  qDebug()<<"函数被析构" ;
}

mywidget.cpp

#include "mywidget.h"
#include"mybutton.h"
myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    
    MyButton *b3=new MyButton(this);//生成一个按钮,这个按钮是QPushButton的派生类;
    b3->setText("123");
    
    //指定父对象后  直接或者间接继承于QObject 
    //子对象如果是动态分配空间的new ,不需要手动释放delete;
    //系统会自动释放
}

myWidget::~myWidget()
{

}

自动释放的条件

    //指定父对象后  直接或者间接继承于QObject 
    //子对象如果是动态分配空间的new ,不需要手动释放delete;
    //系统会自动释放

       //可视化,就得使用析构函数

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值