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

news2024/11/25 10:26:12

目录

坐标体系

窗口的坐标原点

 窗口的相对坐标

示例

 内存回收

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.coloradmin.cn/o/648086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node.js+vue企业人事管理系统q731f

中小企业人事管理系统的主要开发目标如下&#xff1a; &#xff08;1&#xff09;实现管理系统信息关系的系统化、规范化和自动化&#xff1b; &#xff08;2&#xff09;减少维护人员的工作量以及实现员工对信息的控制和管理。 &#xff08;3&#xff09;方便查询信息及管理信…

chatgpt赋能python:Python编程中的警告是什么?

Python编程中的警告是什么&#xff1f; 在Python编程中&#xff0c;警告是指在程序运行时出现的一些提示信息。这些警告通常不会导致程序崩溃&#xff0c;但却表明程序中存在某些问题。例如&#xff0c;警告可以是一个不推荐使用的语法或者可能导致性能退化的某个编码模式。通…

发布关于Strve.js的动态,被Vite团队核心成员点赞的那些事!

近日&#xff0c;在浏览之前发的推特文章时&#xff0c;发现了曾经被Vite团队核心成员 Matias Capeletto 点赞的一篇动态&#xff0c;心里格外的高兴。 被大佬认可&#xff0c;也是值得开心的一件事情。毕竟独立开发一个前端框架&#xff0c;其中的艰辛也只有像参与过类似设计框…

IAB讨论互联网碎片化:互操作性是互联网的关键属性

日前&#xff0c;一场针对互联网碎片化的讨论由互联网体系结构委员会&#xff08;IAB&#xff09;发起&#xff0c;主题涉及互联网碎片化的定义、概念、治理方式与未来发展。互联网治理论坛&#xff08;IGF&#xff09;咨询顾问维姆德格泽尔与大西洋理事会成员康斯坦丁诺斯科迈…

我的个人网站 —— 直接使用GPT4

前期回顾 打造极简风格动效 —— 5 分钟轻松实现惊艳、震撼人心的视觉效果_彩色之外的博客-CSDN博客css Loading 实战教学https://blog.csdn.net/m0_57904695/article/details/131156011?spm1001.2014.3001.5501 目录 ✈ 线上预览&#xff1a; ✅ G4 WEB 效果图例 &…

chatgpt赋能python:Python函数用法查看指南

Python函数用法查看指南 对于Python程序员来说&#xff0c;熟练查看函数用法是必不可少的技能。无论是入门级的学习者还是有多年编程经验的工程师都需要时常查看函数用法&#xff0c;以确保程序的正确性与效率。在本篇文章中&#xff0c;我们将介绍Python函数用法的常用方法与…

chatgpt赋能python:Python如何放在桌面:简单步骤和相关应用

Python如何放在桌面&#xff1a;简单步骤和相关应用 如果你是一名Python程序员&#xff0c;想要将Python放在桌面上以便在日常工作中更快捷地打开&#xff0c;并增强开发效率&#xff0c;那么这篇文章就是为你准备的。在这里&#xff0c;我们将介绍如何将Python安装在桌面上、…

chatgpt赋能python:Python怎么查找序列中的数字

Python怎么查找序列中的数字 在Python编程中&#xff0c;要查找序列中的数字是非常常见的任务。比如&#xff0c;我们需要查找一个列表中是否包含某个数字&#xff0c;或者在一个字符串中查找某个数字的出现次数等等。本文将介绍Python中查找序列中数字的几种方法&#xff0c;…

chatgpt赋能python:Python如何横排输出:实现方法详解

Python如何横排输出&#xff1a;实现方法详解 Python是一种高级编程语言&#xff0c;非常适合初学者入门。Python有很多应用程序领域&#xff0c;例如Web开发、数据分析、人工智能和机器学习等。在这些领域中&#xff0c;输出排版和显示的格式都十分重要。在某些情况下&#x…

C++静态转换

目录 1.1基本类型间的转换 1.2指针转换的限制 1.3空指针的转换 1.4弃值表达式 1.5左值转到右值 1.6类层次结构基类和派生类间的指针或引用转换 用法&#xff1a;static_cast<type_name> (expression) 说明&#xff1a;该运算符把expression转换为type_name类型stat…

ElasticSearch核心详解、文档、查询响应、分页、映射、结构化查询

目录 ElasticSearch核心详解文档元数据&#xff08;metadata&#xff09;index_type_id 查询响应pretty指定响应字段判断文档是否存在 批量操作批量查询_bulk操作 分页映射创建明确类型的索引&#xff1a;测试搜索 结构化查询term查询terms查询range查询exists 查询match查询bo…

Linux 虚拟文件系统 VFS 源码剖析

转自&#xff1a;Linux 虚拟文件系统 VFS 源码剖析 -- 以 ext4 为例&#xff08;Part1&#xff09; - 知乎 虚拟文件系统&#xff08;Virtual File System, VFS&#xff09;是 Linux 内核的一个组件&#xff0c;用于处理与文件和文件系统相关的所有系统调用。VFS 是内核提供文…

架构师怎样绘制系统架构蓝图?

首先&#xff0c;请你设想这样一个场景&#xff1a;如果公司安排你做架构师&#xff0c;要你在项目开发前期进行软件架构设计&#xff0c;你该如何开展你的工作&#xff1f;如何输出你的工作成果&#xff1f;如何确定你的设计是否满足用户需求&#xff1f;你是否有把握最后交付…

人工智能导论复习

Sell Out - Twoset Violin - 单曲 - 网易云音乐 (163.com) 目录 1 归结演绎推理 子句集&#xff1a; 归结&#xff1a; 2 可信度分析 CF模型 加权的不确定性推理 3 模糊推理-构造 扎德方法构造模糊关系 4 A* 5 遗传算法 6 神经网络 1 归结演绎推理 归结推理&#xff…

【ZooKeeper快速入门】 —— 每天一点小知识

&#x1f4a7; Z o o K e e p e r 快速入门 \color{#FF1493}{ZooKeeper快速入门} ZooKeeper快速入门&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

GPU 并行计算入门

文章目录 0. 前言1. CPU vs GPU2. 并行计算简介3. CUDA 简介4. CUDA 的处理流程 0. 前言 在没有GPU之前&#xff0c;基本上所有的任务都是交给CPU来做的。有GPU之后&#xff0c;二者就进行了分工&#xff0c;CPU负责逻辑性强的事物处理和串行计算&#xff0c;GPU则专注于执行高…

chatgpt赋能python:Python如何横着输入优化网站SEO

Python如何横着输入优化网站SEO 简介 Python作为一种强大的编程语言&#xff0c;在网络开发、数据处理、机器学习、人工智能等领域得到了广泛应用。随着互联网的发展&#xff0c;优化网站SEO已成为网站管理者不可或缺的重要职责&#xff0c;而如何横着输入也是优化SEO的重要一…

chatgpt赋能python:Python求平方:简单方便的方法

Python求平方&#xff1a;简单方便的方法 Python是一种功能强大、易学易用的编程语言&#xff0c;许多人使用它来进行数学计算。在Python中求一个数的平方是非常简单的。本文将介绍一些方法来实现这一任务。 使用**操作符 Python中的**操作符是求平方的快捷方式。它将一个数…

Golang每日一练(leetDay0097) 顶端迭代器、寻找重复数

目录 284. 顶端迭代器 Peeking Iterator &#x1f31f;&#x1f31f; 287. 寻找重复数 Find the Duplicate Number &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练…

应聘求职自荐信优秀范文5篇

应聘求职自荐信优秀范文篇1 尊敬的领导&#xff1a; 您好!衷心的感谢您在百忙之中翻阅我的这份材料&#xff0c;并祝愿贵单位事业欣欣向荣&#xff0c;蒸蒸日上! 我是哈尔滨理工大学测控技术及通信工程学院________届毕业生&#xff0c;自从今日大学之后&#xff0c;高考后的轻…