
🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!
🎬 博主简介:

文章目录
- 前言:
- [一. Qt UI 开发实战:两种方式实现界面组件](#一. Qt UI 开发实战:两种方式实现界面组件)
-
- [1.1 标签(QLabel)实现(带样式美化)](#1.1 标签(QLabel)实现(带样式美化))
- [1.2 按钮(QPushButton)实现](#1.2 按钮(QPushButton)实现)
- [二. Qt 内存管理核心:对象树机制(避免内存泄漏)](#二. Qt 内存管理核心:对象树机制(避免内存泄漏))
-
- [2.1 对象树核心原理](#2.1 对象树核心原理)
- [2.2 对象树实战验证](#2.2 对象树实战验证)
- [2.3 避坑指南](#2.3 避坑指南)
- [三. Qt 窗口坐标体系:精准控制组件位置](#三. Qt 窗口坐标体系:精准控制组件位置)
-
- [3.1 核心规则](#3.1 核心规则)
- [3.2 常用位置操作函数](#3.2 常用位置操作函数)
- [3.3 实战示例:居中显示组件](#3.3 实战示例:居中显示组件)
- [四. Qt 开发关键技巧与避坑汇总](#四. Qt 开发关键技巧与避坑汇总)
-
- [4.1 命名规范](#4.1 命名规范)
- [4.2 常用快捷键](#4.2 常用快捷键)
- [4.3 帮助文档使用](#4.3 帮助文档使用)
- 结尾:
前言:
Qt 入门后,核心进阶点集中在 "UI 开发实战、项目文件解析、内存管理机制" 三大模块。从 Hello World 程序的两种实现方式,到项目文件的底层逻辑,再到 Qt 独有的对象树内存管理,这些知识点直接决定开发效率和程序稳定性。本文聚焦 Qt UI 开发(纯代码 + 可视化)、项目文件深度解析、对象树机制、坐标体系四大核心,搭配实战代码和避坑指南,帮你从 "会用 Qt" 升级到 "活用 Qt"。
一. Qt UI 开发实战:两种方式实现界面组件
Qt 支持 "纯代码开发" 和 "可视化拖拽开发" 两种 UI 实现方式,前者灵活可控,后者高效快捷,可根据场景选择。
1.1 标签(QLabel)实现(带样式美化)
标签常用于显示文本或图片,下面演示带字体、颜色、位置设置的完整实现:
(1)纯代码方式(带样式优化)
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>
#include <QFont> // 字体头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 设置窗口固定大小
this->setFixedSize(800, 600);
// 2. 创建标签,指定父对象
QLabel *lab = new QLabel(this);
// 3. 设置标签文本
lab->setText("Qt进阶实战");
// 4. 设置字体(字体类型+大小+加粗)
QFont font("微软雅黑", 24, QFont::Bold);
lab->setFont(font);
// 5. 设置文本颜色(红色)
lab->setStyleSheet("color: red;");
// 6. 设置标签位置(居中显示)
lab->move((800 - lab->width())/2, 200);
}
// ............
(2)可视化方式(快速美化)
- 拖拽 "Label" 组件到 UI 设计窗口,双击修改文本为 "Qt 进阶实战";
- 在属性设置区设置:
font:点击右侧 "...",选择字体、大小并勾选加粗;styleSheet:输入color: red;设置文本颜色;alignment:选择 "水平居中 + 垂直居中";
- 拖动标签到目标位置,或通过
geometry属性精确设置坐标。

核心注意事项
- 创建组件时务必指定父对象(如
new QPushButton(this)),否则组件不会显示在窗口上,且无法被对象树管理; - 纯代码方式适合动态生成组件(如循环创建多个按钮),可视化方式适合固定布局的静态界面;
- 样式设置优先使用
setStyleSheet(支持 CSS 语法),灵活度更高。


1.2 按钮(QPushButton)实现
(1)纯代码方式(灵活可控)
无需依赖.ui 文件,直接通过代码创建按钮并设置属性,适合动态生成组件的场景:
cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
myButton = new QPushButton(this);
myButton->setText("Hello WOrld");
connect(myButton, &QPushButton::clicked, this, &Widget::handleClick);
}
void Widget::handleClick()
{
if(myButton->text() == QString("Hello World")){
myButton->setText("Hello Qt");
}
else{
myButton->setText("Hello World");
}
}
Widget::~Widget()
{
delete ui;
}
注意:.h 文件这里展示一下,因为得整成成员变量
cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
void handleClick();
~Widget();
private:
Ui::Widget *ui;
QPushButton* myButton; // 这一步很关键
};
#endif // WIDGET_H
(2)可视化方式(高效快捷)
通过 Qt Creator 的 UI 设计器拖拽组件,无需手动编写布局代码:
-
双击项目中的
widget.ui文件,进入设计模式; -
在左侧 "组件选择区" 找到 "Push Button",拖拽到中间的 UI 设计窗口;
-
选中按钮,在右侧 "属性设置区" 修改属性:
text:设置按钮文本(如 "点击测试");geometry:设置位置和大小(x=100, y=100, 宽 = 120, 高 = 40);objectName:设置组件唯一标识(如 "myButton",后续代码中可通过ui->myButton访问);
-
直接构建运行,界面自动生效。
依靠一些信号槽实现一下按钮的切换:(后面会讲这个知识点的)
cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->myButton, &QPushButton::clicked, this, &Widget::handleClick);
}
Widget::~Widget()
{
delete ui;
}
void Widget::handleClick()
{
if(ui->myButton->text() == QString("Hello World")){
ui->myButton->setText("Hello Qt");
}
else{
ui->myButton->setText("Heelo World");
}
}


二. Qt 内存管理核心:对象树机制(避免内存泄漏)
Qt 最具特色的就是 "对象树" 内存管理机制,无需手动释放大多数组件,大幅简化内存管理。
2.1 对象树核心原理
- 父对象与子对象 :当创建 QObject 子类对象时,指定父对象(如
new QPushButton(this)),子对象会自动加入父对象的children()列表; - 自动析构:父对象析构时,会遍历children()列表,自动删除所有子对象,避免内存泄漏;
- 适用范围:所有继承自 QObject 的类(如 QWidget、QPushButton、QLabel 等核心组件)。
2.2 对象树实战验证
通过自定义按钮类,观察构造和析构顺序:(这个创建类文件的过程这里就不展示了,比较基础)
cpp
// mypushbutton.h
#include <QPushButton>
#include <QDebug>
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
explicit MyPushButton(QWidget *parent = nullptr) : QPushButton(parent)
{
qDebug() << "自定义按钮构造";
}
~MyPushButton()
{
qDebug() << "自定义按钮析构";
}
};
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mypushbutton.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建自定义按钮,指定父对象为当前窗口
MyPushButton *btn = new MyPushButton(this);
btn->setText("测试对象树");
}
Widget::~Widget()
{
qDebug() << "窗口析构";
delete ui;
}
结论:子对象(按钮)的析构在父对象(窗口)析构之后,对象树确保所有子组件被自动释放。

2.3 避坑指南
- 不要手动删除子对象:若手动
delete btn,父对象析构时会再次删除,导致双重释放崩溃; - 优先在构造时指定父对象:避免后续通过
setParent()设置(可能导致析构顺序混乱); - 栈上对象也支持对象树:如
QPushButton btn(this),析构时同样会被父对象管理。

三. Qt 窗口坐标体系:精准控制组件位置
Qt 坐标体系是组件布局的基础,核心规则如下:
3.1 核心规则
- 原点(0,0):窗口左上角;
- 坐标轴方向:x 轴向右递增,y 轴向下递增;
- 嵌套组件 :子组件的坐标相对于父组件的左上角,而非屏幕。

3.2 常用位置操作函数
cpp
// 1. 设置组件位置(x, y)
btn->move(100, 200);
// 2. 设置组件大小(宽, 高)
btn->resize(120, 40);
// 3. 设置固定大小(不可拉伸)
btn->setFixedSize(120, 40);
// 4. 获取组件位置和大小
int x = btn->x(); // 获取x坐标
int y = btn->y(); // 获取y坐标
QSize size = btn->size(); // 获取大小
QRect rect = btn->geometry(); // 获取位置+大小(x, y, 宽, 高)

3.3 实战示例:居中显示组件
cpp
// 让标签在800x600的窗口中居中
QLabel *lab = new QLabel("居中显示", this);
lab->setFixedSize(200, 50);
// 计算居中坐标:(窗口宽-组件宽)/2, (窗口高-组件高)/2
int x = (this->width() - lab->width()) / 2;
int y = (this->height() - lab->height()) / 2;
lab->move(x, y);
四. Qt 开发关键技巧与避坑汇总
4.1 命名规范
- 类名 :首字母大写,单词间首字母大写(如
MyPushButton); - 函数名 / 变量名 :首字母小写,单词间首字母大写(如
setFixedSize、testBtn); - 文件名 :与类名一致(如
MyPushButton.h、MyPushButton.cpp)。
4.2 常用快捷键
Ctrl+/:快速注释 / 取消注释;Ctrl+R:运行项目;Ctrl+B:构建项目(编译);F4:在.h 和.cpp 文件间快速切换;F1:打开选中类 / 函数的官方文档(优先看英文文档,准确性更高);Ctrl+I:代码自动对齐。
4.3 帮助文档使用
Qt 帮助文档是最佳学习资料,三种打开方式:
- 光标选中类名(如
QPushButton),按F1; - 打开 Qt Creator,点击左侧 "帮助" 模式;
- 找到 Qt 安装目录下的
bin\assistant.exe,双击打开独立帮助窗口。
结尾:
html
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!
结语:本文覆盖了 Qt UI 开发的两种方式、项目文件解析、对象树内存管理、坐标体系四大核心,这些都是实际开发中高频用到的知识点。掌握这些内容后,可轻松应对大部分桌面应用和嵌入式界面开发需求。后续可进一步学习 "信号与槽机制"(Qt 组件通信核心)、"布局管理"(自适应窗口大小)、"自定义组件" 等进阶内容。
✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど
