QT学习(七)——坐标系统与内存回收机制

坐标系统:

1.对于主窗口,坐标系统相对于屏幕

原点:相对于屏幕左上角

x:往右递增

y:往下递增

 

2.对于子窗口,坐标系统相对于主窗口

原点:相对于窗口空白区域左上角(不包括边框)

 

Coord.cpp文件代码:

#include "coord.h"
#include<QPushButton>
#include"mybutton.h"
Coord::Coord(QWidget *parent)
    : QWidget(parent)
{
    /*
     *对于主窗口,坐标系统相对于屏幕
     * 原点:相对于屏幕左上角
     *x:往右递增
     *y:往下递增
     */
    move(100,100);//移动主窗口
    resize(300,400);
    /*
     * 对于子窗口,坐标系统相对于主窗口
     * 原点:相对于窗口空白区域左上角(不包括边框)
     */
    QPushButton*w=new QPushButton(this);
    w->move(0,0);
    w->setText("HAHA");
    w->resize(200,100);//设置按钮大小


    //在按钮中在设置一个按钮
    /*
     * 可以了解,对于任意两个窗口,包括一个按钮也可以视为一个窗口,
     * 都有主副窗口之分,父窗口的移动总是以主窗口的左上角为参照物
     */
    QPushButton*p=new QPushButton(w);
    p->move(0,0);
    p->setText("我是按钮的子按钮");
}

 

程序运行:

 

综上可知:

我在按钮中又设置了一个按钮,发现对于任意两个窗口,包括一个按钮也可以视为一个窗口,都有主副窗口之分,父窗口的移动总是以主窗口的左上角为参照物

--------------------------------------------------------------------------------------------------

内存回收机制:

为了明白C++的QT框架内存回收机制,重新继承QPushButton类来形成一个MyButton类。

MyButton.h文件代码:

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include<QWidget>
class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);//这里的QWidget不更改是因为,我需要把按钮的主窗口设置为最大的那个基类窗口
    ~MyButton();

signals:

};

#endif // MYBUTTON_H

MyButton.cpp文件代码:

#include "mybutton.h"
#include<QPushButton>
#include<QDebug>
#include<QWidget>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)//调用原来按钮的构造函数把基类窗口指定为按钮的父类窗口
{

}
MyButton::~MyButton()
{
    qDebug()<<"按钮被析构";//当析构函数被调用的时候打印这句话
}

Coord.cpp文件代码:

#include "coord.h"
#include<QPushButton>
#include"mybutton.h"
Coord::Coord(QWidget *parent)
    : QWidget(parent)
{
    /*
     *对于主窗口,坐标系统相对于屏幕
     * 原点:相对于屏幕左上角
     *x:往右递增
     *y:往下递增
     */
    move(100,100);//移动主窗口
    resize(300,400);
    /*
     * 对于子窗口,坐标系统相对于主窗口
     * 原点:相对于窗口空白区域左上角(不包括边框)
     */
    QPushButton*w=new QPushButton(this);
    w->move(0,0);
    w->setText("HAHA");
    w->resize(200,100);//设置按钮大小


    //在按钮中在设置一个按钮
    /*
     * 可以了解,对于任意两个窗口,包括一个按钮也可以视为一个窗口,
     * 都有主副窗口之分,父窗口的移动总是以主窗口的左上角为参照物
     */
    QPushButton*p=new QPushButton(w);
    p->move(0,0);
    p->setText("我是按钮的子按钮");



    MyButton*i=new MyButton(this);
    i->move(200,200);
    i->setText("MyButton");
    //根据程序运行可知

    //1.在指定父对象后
    //2.直接或间接继承于QObject
    //3.子对象如果是动态分配空间的,即使用new函数分配的
    //那么子对象不需要手动释放,即使用delete,系统会自动释放


}

程序运行:
 

当我点击右上角的“x”来结束程序的时候

打印出了这句话,说明被new出来的空间,在程序运行完毕后自动的释放了。

 

 

综上,

满足下列三个条件的空间:

1.在指定父对象后

2.直接或间接继承于QObject

3.子对象如果是动态分配空间的,即使用new函数分配的

 那么子对象不需要手动释放,即使用delete,系统会自动释放

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值