💪 图像算法工程师,专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》
📝《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中对象树和坐标系详细图文讲解,希望能帮到你!
感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖
关注下面「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!