目录
坐标体系
窗口的坐标原点
窗口的相对坐标
示例
内存回收
1. 自动垃圾回收机制
2. 对象树机制
示例
坐标体系
窗口的坐标原点
在Qt中,坐标系统一般是以窗口左上角为原点,向右为正方向X轴,向下为正方向Y轴。
窗口的相对坐标
在一个 Qt 窗口中一般都有很多子窗口内嵌到这个父窗口中,其中每个窗口都有自己的坐标原点,子窗口的位置也就是其使用的坐标点就是它的父窗口坐标体系中的坐标点。
在 Qt 的某一个窗口中有可能有若干个控件,这个控件都是嵌套的关系
A 窗口包含 B 窗口,B 窗口包含 C 窗口
每个窗口都有坐标原点,在左上角
子窗口的位置是基于父窗口的坐标体系来确定的,也就是说通过父窗口左上角的坐标点来确定自己的位置
Qt 中窗口显示的时候使用的相对坐标,相对于自己的父窗口
将子窗口移动到父窗口的某个位置
// 所有窗口类的基类: QWidget
// QWidget中提供了移动窗口的 API函数
// 参数 x, y是要移动的窗口的左上角的点, 窗口的左上角移动到这个坐标点
void QWidget::move(int x, int y);
void QWidget::move(const QPoint &);
示例:
新建一个coordinate项目
mainwindow.cpp中的代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//创建一个按钮,让这个按钮作为当前创建的子部件
QPushButton* btnA = new QPushButton(this);
//移动按钮位置
btnA->move(10,10);
//给按钮设置固定大小
btnA->setFixedSize(200,200);
//创建第二个按钮
QPushButton* btnB = new QPushButton(btnA);
//移动按钮位置
btnB->move(10,10);
//给按钮设置固定大小
btnB->setFixedSize(100,100);
//创建第三个按钮
QPushButton* btnC = new QPushButton(btnB);
//移动按钮位置
btnC->move(10,10);
//给按钮设置固定大小
btnC->setFixedSize(50,50);
}
MainWindow::~MainWindow()
{
delete ui;
}
运行结果:
内存回收
在Qt中,内存回收机制主要通过自动垃圾回收机制和对象树机制来实现。
1. 自动垃圾回收机制
Qt中的自动垃圾回收机制主要是通过元对象系统(Meta-Object System)来实现的。元对象系统是一种在运行时动态创建和管理对象的机制,通过元对象系统,Qt可以在对象销毁时自动回收它所占用的内存。在Qt中,所有继承自QObject的对象都可以使用自动垃圾回收机制,一般是通过QObject::deleteLater()函数来触发对象的销毁和内存回收。
2. 对象树机制
在Qt中,一个对象可以有一个或多个子对象,这些子对象都在一个树形结构中,称为对象树。在对象树中,子对象的生命周期会受到父对象的控制,当父对象被销毁时,它所有的子对象也会被销毁,从而实现了自动的内存回收机制。
综上所述,我们可以得到一个结论: Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收 , 如果想要在 Qt 中实现内存的自动回收,需要满足以下两个条件:
创建的对象必须是 QObject 类的子类 (间接子类也可以)
QObject 类是没有父类的,Qt 中有很大一部分类都是从这个类派生出去的
Qt 中使用频率很高的窗口类和控件都是 QObject 的直接或间接的子类
创建出的类对象,必须要指定其父对象是谁,一般情况下有两种操作方式:
// 方式1: 通过构造函数
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可
QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);
// 方式2: 通过setParent()方法
// 假设这个控件没有在构造的时候指定符对象, 可以调用QWidget的api指定父窗口对象
void QWidget::setParent(QWidget *parent);
void QObject::setParent(QObject *parent);
示例:
新建一个SubWindow项目
在ui界面随便添加一些按钮
mainwindow.cpp代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "subwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
SubWindow* sub = new SubWindow(this);
sub->show();//非模态显示
}
MainWindow::~MainWindow()
{
delete ui;
}
subwindow.cpp代码:
#include "subwindow.h"
#include "ui_subwindow.h"
#include <QDebug>
SubWindow::SubWindow(QWidget *parent) :
QDialog(parent),
ui(new Ui::SubWindow)
{
ui->setupUi(this);
}
SubWindow::~SubWindow()
{
qDebug()<<"我是SubWindow,我被析构了...";
delete ui;
}
运行结果:
当关闭主窗口时