使用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;
//系统会自动释放
//可视化,就得使用析构函数