Qt中对象树和坐标系(详细图文讲解_附C++代码)

在这里插入图片描述

💪 图像算法工程师,专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》
📝《C++》
📝《Qt》


在这里插入图片描述

一、对象树

在 Qt 中,对象树是一个用来管理对象及其层次结构的核心机制。它利用 父子关系 自动管理对象的生命周期,并简化内存管理。所有继承自 QObject 的类(如 QWidget、QPushButton 等)都可以使用对象树。

对象树的好处:
内存安全:通过父子关系自动管理对象,减少内存泄漏。
简化代码:开发者无需手动删除子对象。
可维护性:清晰的层次结构方便调试和维护。

1.1 对象树特点

对象树的特点。

父子关系

每个 QObject 对象都有一个父对象(可选)和多个子对象。
当父对象被销毁时,其子对象会自动销毁。

生命周期管理

Qt 的对象树机制减少了内存泄漏的风险。
无需手动删除子对象,父对象会自动处理。

层次结构

对象树类似于一个树形结构,根对象是树的根节点,其下是各级子节点。

信号与槽

父子关系可以简化信号与槽的连接管理。

1.2 创建对象树

父子关系可以通过以下方式建立:
(1)在构造函数中传递父对象

QPushButton *button = new QPushButton("Click Me", parent); // parent 是父对象

(2)使用 setParent() 方法

QPushButton *button = new QPushButton("Click Me");
button->setParent(parent); // 设置 parent 为父对象

1.3 对象树的内存管理

当一个父对象被销毁时,所有子对象会被自动销毁。例如:

QWidget *parent = new QWidget;
QPushButton *child1 = new QPushButton(parent);
QPushButton *child2 = new QPushButton(parent);

delete parent; // child1 和 child2 会被自动销毁

1.4 示例代码

以下代码展示了一个简单的对象树结构:

#include <QApplication>
#include <QPushButton>
#include <QWidget>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Object Tree Example");
    window->resize(400, 300);

    QPushButton *button1 = new QPushButton("Button 1", window); // 父对象为 window
    button1->move(50, 50);

    QPushButton *button2 = new QPushButton("Button 2");
    button2->setParent(window); // 通过 setParent 设置父对象
    button2->move(150, 50);

    // 打印对象树
    foreach(QObject *child, window->children()) {
        qDebug() << "Child:" << child->metaObject()->className();
    }

    window->show();
    return app.exec();
}

1.5 界面效果

运行结果:

窗口中有两个按钮,父对象为 window。
控制台输出窗口的直接子对象类型。

实际效果见下:

在这里插入图片描述

二、坐标系

在 Qt 中,坐标系是用于描述控件或窗口中元素位置的关键概念。Qt 提供了多个坐标系以适应不同的绘制需求和窗口管理场景。以下是 Qt 坐标系的基础知识和常见用法。

2.1 窗口坐标系(Widget Coordinates)

以窗口(控件)左上角为原点 (0, 0)。

横向为正方向(右),纵向为正方向(下)。

适用于控件的布局、绘制和位置调整。

2.2 全局坐标系(Global Coordinates)

以整个屏幕的左上角为原点 (0, 0)。

用于描述屏幕上的绝对位置。

常用方法:

mapToGlobal(const QPoint &pos):将窗口内的局部坐标转换为全局坐标。
mapFromGlobal(const QPoint &pos):将全局坐标转换为窗口内的局部坐标。

2.3 局部坐标系(Local Coordinates)

用于描述子控件相对于其父控件的位置。

子控件以其父控件的左上角为原点 (0, 0)。

2.4 视图坐标系(Graphics View Coordinates)

专门用于 QGraphicsView 场景绘制系统。

原点和方向可以通过场景变换(QGraphicsView::setTransform)进行调整。

2.5 坐标系方向

默认方向:

X 轴向右为正。
Y 轴向下为正。

翻转坐标方向: 在某些情况下,可以通过矩阵变换(QTransform)修改坐标系方向,例如:

QTransform transform;
transform.scale(1, -1); // 翻转 Y 轴方向
painter->setTransform(transform);

2.6 示例代码

以下代码展示如何使用坐标系:

#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    window.setFixedSize(400, 300);
    window.setWindowTitle("Qt 坐标系示例");

    QPushButton *button = new QPushButton("Click Me", &window);
    button->move(50, 50); // 设置按钮在窗口内的位置

    // 获取坐标
    qDebug() << "按钮相对于窗口的坐标:" << button->pos(); // 局部坐标
    qDebug() << "按钮在屏幕的全局坐标:" << button->mapToGlobal(QPoint(0, 0));

    // 转换坐标
    QPoint globalPos = button->mapToGlobal(QPoint(0, 0));
    QPoint localPos = window.mapFromGlobal(globalPos);
    qDebug() << "全局坐标转换回窗口坐标:" << localPos;

    window.show();
    return app.exec();
}

2.7 效果展示

运行上面2.6中代码,输出见下:

在这里插入图片描述

三、总结

以上就是Qt中对象树和坐标系详细图文讲解,希望能帮到你!

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

关注下面「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉研坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值