Qt学习笔记 (按钮,对象,对象树,析构顺序)

Qt的优点:一定程度上简化了内存的回收
new出来的对象不需要手动释放
当你写一个对象模型的时候,用new创建时,会加到children表中
children表中是一个树形的结构,对象树
这个树,在你的代码点击关闭关闭时,他会回收所有new出来的对象
但是前提是,想要释放的对象必须都加都children表上
对象树也叫children表

//.pro文件 (自动生成)
#-------------------------------------------------
#
# Project created by QtCreator 2019-08-15T08:12:03
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = 01_Qt_First
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        mybutton.cpp \
        mywidget.cpp

HEADERS += \
        mybutton.h \
        mywidget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
//Mybutton头文件
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include 

#include 

class Mybutton : public QPushButton//QWidget
{
    Q_OBJECT
public:
    explicit Mybutton(QWidget *parent = nullptr);
    ~Mybutton();
//explicit 防止构造的隐式类型转换
signals:

public slots:
};

#endif // MYBUTTON_H
//MyWidget头文件
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include 

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();
};

#endif // MYWIDGET_H
//main.cpp文件
#include "mywidget.h"
#include //包含头文件,应用程序的头文件

#include "stdio.h"

//程序入口,argc 是命令行变量数量,argv命令行变量的数组
//对窗口移动点击都会发送命令
int main(int argc,char *argv[])
{

    QApplication a(argc,argv); //应用程序对象 a,qt中,有且仅有一个 应用程序对象
    MyWidget w;  //创建MyWidget 对象 w  MyWidget 基类是QWidget
    w.show();  //窗口默认是不会弹出的,如果想弹出,调用show方法


    return a.exec();//a.exec()进入消息循环机制,pause 防止程序闪退




//    while(1){

//        if(点了叉子){
//            break;
//        }

//    }

}
//pro文件是自动生成的文件,不要往里写代码,写的代码不对,或有中文时,

//mybutton.cpp
#include "mybutton.h"
#include //打印信息
//头文件QDebug中Q大写
//用的时候 qDdebug()中q小写
//默认加上了换行

//调用父类构造函数 修改一下
Mybutton::Mybutton(QWidget *parent) : QPushButton (parent) //QWidget(parent);
{

}
Mybutton::~Mybutton(){
    qDebug()<<"Mybutton的析构函数";
    //构造是由上往下执行的
    //析构是由下往上执行的

}


 

//mywidget.cpp文件  重点看这里
#include "mywidget.h"
#include 
#include 


#include "mybutton.h"//包含自己的头文件


//注释快捷键 ctrl+/

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
//添加模块到pro文件

//按钮
    QPushButton * btn=new QPushButton;
    //btn->show();//以顶层方式弹出,如果想在mywidget中显示,就需要依赖mywidget窗口
    btn->setParent(this);//this指针永远指向当前类,让mywidget作为btn的父亲
    //设置文字
    btn->setText("德玛西亚");
    //将char*隐式zhua转换为QString
    //输出乱码 工具 选项 行为 默认编码 utf8

    //

    //创建按钮的第二种方式
    QPushButton *btn2=new QPushButton("第二个按钮",this);
    //窗口会默认按第二个按钮的大小显示

    //重置窗口大小
    this->resize(420,380);
   //后创建的按钮,先显示,把后边的东西盖上了
    btn2->move(100,100);
    //按钮也可以重置大小
    btn2->resize(50,50);

    //左上角窗口标题可以重置
    this->setWindowTitle("第一个窗口");//this可以省略
    //设置窗口固定大小

    setFixedSize(500,500);




//*****************重点看这里******************
    //一定程度上简化了内存回收
    Mybutton *mybtn=new Mybutton;
mybtn->setText("我的button");
mybtn->move(300,300);
mybtn->setParent(this);
//这时候可以写一个析构,验证一下 内存回收机制
//对象树的概念,一定程度上简化了内存回收机制
//不过一定要把对象放进表里边,my->setParent(this)这个操作
//this就是MyWidget
//下面打印一下MyWidget的析构
//内容如下,很奇怪吧
//MyWidget析构函数
//Mybutton的析构函数
//其实不奇怪,打印的流程是:
//先到父类打印信息,然后看父类是否有子类
//如果有,就再去子类里打印信息,依次类推
//直到子类的子类.....的子类.....再没有子类时,并且都打印完时,才由下往上逐层析构
//所有new出来的对象,只要在对象树上,那么回收时就不用管释放(设置了parent)
}

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









#include "mywidget.h"
#include 
#include 


#include "mybutton.h"//包含自己的头文件


//注释快捷键 ctrl+/

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
//添加模块到pro文件

//按钮
    QPushButton * btn=new QPushButton;
    //btn->show();//以顶层方式弹出,如果想在mywidget中显示,就需要依赖mywidget窗口
    btn->setParent(this);//this指针永远指向当前类,让mywidget作为btn的父亲
    //设置文字
    btn->setText("德玛西亚");
    //将char*隐式zhua转换为QString
    //输出乱码 工具 选项 行为 默认编码 utf8

    //

    //创建按钮的第二种方式
    QPushButton *btn2=new QPushButton("第二个按钮",this);
    //窗口会默认按第二个按钮的大小显示

    //重置窗口大小
    this->resize(420,380);
   //后创建的按钮,先显示,把后边的东西盖上了
    btn2->move(100,100);
    //按钮也可以重置大小
    btn2->resize(50,50);

    //左上角窗口标题可以重置
    this->setWindowTitle("第一个窗口");//this可以省略
    //设置窗口固定大小

    setFixedSize(500,500);
    //一定程度上简化了内存回收
    Mybutton *mybtn=new Mybutton;
mybtn->setText("我的button");
mybtn->move(300,300);
mybtn->setParent(this);
//这时候可以写一个析构,验证一下 内存回收机制
//对象树的概念,一定程度上简化了内存回收机制
//不过一定要把对象放进表里边,my->setParent(this)这个操作
//this就是MyWidget
//下面打印一下MyWidget的析构
//内容如下,很奇怪吧
//MyWidget析构函数
//Mybutton的析构函数
//其实不奇怪,打印的流程是:
//先到父类打印信息,然后看父类是否有子类
//如果有,就再去子类里打印信息,依次类推
//直到子类的子类.....的子类.....再没有子类时,并且都打印完时,才由下往上逐层析构
//所有new出来的对象,只要在对象树上,那么回收时就不用管释放(设置了parent)

//Qt坐标系
//x为右侧正向  y为下方正向




//点击我的按钮  关闭窗口
//信号关键字,signals

//clicked(bool checked=false)//有按下和弹起
//pressed()
//released()
//goggled(bool checked)布尔状态值 如灯 按下被打开了,再按,灯关闭了
//参数1 信号的发送者,参数2 发送的信号 参数3 信号的接收者, 参数4 处理的槽函数
//槽的单词是Slots,关闭函数close 有一个返回值,暂时用不上

//connect(mybtn,&Mybutton::clicked,this,&MyWidget::close);
//用当前对象所属的类和他的父类都可以
//一行代码四个参数,很简单
connect(mybtn,&QPushButton::clicked,this,&QWidget::close);

}

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



另附对象树结构图:

Qt学习笔记 (按钮,对象,对象树,析构顺序)_第1张图片

(本笔记内容整理自网络资源,侵删) 

你可能感兴趣的:(Qt)