Qt中的坐标体系和内存回收

news/2024/11/15 6:08:13/

目录

坐标体系

窗口的坐标原点

 窗口的相对坐标

示例

 内存回收

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;
}

运行结果:

当关闭主窗口时

 

 


http://www.ppmy.cn/news/395554.html

相关文章

【30天熟悉Go语言】7 Go流程控制之分支结构if、switch

文章目录 一、前言二、if1、单分支Go语法规范&#xff1a; 2、双分支Go语法规范 3、多分支 三、switch1、基本语法2、语法规范1&#xff09;switch2&#xff09;case3&#xff09;default 四、总结 一、前言 Go系列文章&#xff1a; GO开篇&#xff1a;手握Java走进Golang的世界…

编程语言/文件系统/网络协议存在的那些编码

前面的文章介绍了URL编码&#xff0c;UTF8编码&#xff0c;base64&#xff0c;gzip等多种编解码的方式&#xff0c;这里&#xff0c;本节对字符和编码一些杂项进行梳理&#xff0c;相信你会感兴趣。 Python 中的字符和编码 为什么要强调字符编号和字符编码分离这样⼀个概念呢…

Qt中的重要概念:构建现代化跨平台应用的基石

Qt中的重要概念&#xff1a;构建现代化跨平台应用的基石 简介&#xff1a; Qt是一款功能强大且广泛应用于跨平台应用开发的C框架。它提供了丰富的工具和功能&#xff0c;使开发者能够轻松创建现代化、高性能的应用程序。本文将介绍Qt中的一些重要概念&#xff0c;这些概念是构…

海思平台上USB WIFI的移植与局域网无线调试和视频流预览

目录 1.海思平台上USB WIFI移植概述 1.1、移植WIFI背景 1.2、移植的起点 1.3、实验案例 2.AP模式USB WIFI驱动移植 2.1、源码 2.2、修改移植 3.AP模式USB WIFI传输视频实战 3.1、部署USB WIFI驱动使之工作为AP 3.2、准备测试用例 3.3、测试实验 4.USB WIFI做sta模式…

iPod死机后如何重启

今天我的iPod死机了,找到一个重启iPod的方法,如果你的iPod死机了,也能用的上:1.首先确认hold键在off的状态2.如果你的iPod是4代,mini或者更新的(我的是5代Video,30G),按住Menu和Select键(中间的圆白键)不放,过一会儿,iPod就重启了.

20年前 iPod 改变了世界,20年后它变成了怀旧机器

整理 | 祝涛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2001年10月23日&#xff0c;史蒂夫乔布斯在苹果公司前总部Infinite Loop的小型产品发布会上介绍了第一代iPod&#xff0c;这是苹果公司历史上最具决定性的时刻之一&#xff0c;如今已然过去了20…

is_mobile()判断手机移动设备

is_mobile()判断手机移动设备.md is_mobile()判断手机移动设备 制作响应式主题时会根据不同的设备推送不同的内容&#xff0c;是基于移动设备网络带宽压力&#xff0c;避免全局接收pc端内容。 function is_mobile() { $user_agent $_SERVER[ HTTP_USER_AGENT ]; $mobile_brows…

误删的苹果电脑硬盘和数据库的数据怎么恢复

不小心删除了重要的数据怎么办&#xff1f;有没有懊恼&#xff0c;伤心&#xff0c;后悔呢&#xff1f;别急来试试几款数据恢复工具吧。 第一款&#xff1a;Wondershare Recoverit万兴数据恢复软件 Wondershare Recoverit for Mac是一个全面的数据恢复套件&#xff0c;用于恢…