使用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函数构造的wb1.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_OBJECTpublic: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 改成QPushButtonclass 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;
//系统会自动释放
//可视化,就得使用析构函数