坐标系统:
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,系统会自动释放