小叶-duck个人主页❄️个人专栏《Data-Structure-Learning》《C入门到进阶自我学习过程记录》《Linux操作系统从入门到实践》《Qt从入门到实践》《算法题讲解指南》--优选算法《算法题讲解指南》--递归、搜索与回溯算法《算法题讲解指南》--动态规划算法✨未择之路不须回头已择之路纵是荆棘遍野亦作花海遨游目录前言一、标签QLabel实现helloworld1.1 方式1图形化方式创建helloworld1.2 方式2代码创建helloworld二、Qt 内存管理核心对象树机制避免内存泄漏2.1 对象树核心原理2.2 对象树实战验证2.3 避坑指南三、编辑框QLineEdit实现helloworld3.1 方式1图形化方式创建helloworld3.2 代码创建helloworld四、按钮QPushButton实现helloworld4.1 方式1图形化方式创建helloworld4.2 方式2代码创建helloworld五、Qt 窗口坐标体系5.1 核心规则5.2 常用位置操作函数5.3 实战示例居中显示组件六、Qt 开发关键技巧与避坑汇总6.1 命名规范6.2 常用快捷键6.3 帮助文档使用结束语前言Qt 作为主流跨平台 GUI 开发框架入门阶段打好基础尤为关键。本文结合从零创建 HelloWorld、手写代码实现界面、内存泄露与对象树机制、中文乱码问题排查以及按钮 / 输入框基础控件、命名规范、文档查询、Qt 坐标系等核心知识点梳理 Qt 初识阶段的完整学习脉络帮新手快速夯实 Qt 开发底层认知为后续界面开发与项目实战做好铺垫。一、标签QLabel实现helloworld1.1 方式1图形化方式创建helloworld拖拽 “Label” 组件到 UI 设计窗口双击修改文本为 “Qt 进阶实战”在属性设置区设置font点击右侧 “…”选择字体、大小并勾选加粗styleSheet输入color: red;设置文本颜色alignment选择 “水平居中 垂直居中”拖动标签到目标位置或通过geometry属性精确设置坐标。1.2 方式2代码创建helloworld代码简单实现hello world#include widget.h #include ui_widget.h #include QLabel Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); QLabel *label new QLabel(this); //更推荐在堆上创建的方式 //label-setText(QString(hello world)); label-setText(hello world);//可以不显式写构造函数直接传字符串会进行隐式类型转换 } ...虽然可以在栈上创建label但是只是可以创建而无法实现功能原因就是当函数结束的时候会进行出栈而在栈上创建的局部变量就会连同一起被销毁就会导致运行程序的时候界面上没有标签的结果展示。最后可以演示一下带字体、颜色、位置设置等的完整实现#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 *label new QLabel(this); // 3. 设置标签文本 label-setText(Hello QT); // 4. 设置字体字体类型大小加粗 QFont font(微软雅黑, 24, QFont::Bold); label-setFont(font); // 5. 设置文本颜色红色 label-setStyleSheet(color: red;); // 6. 设置标签位置居中显示 label-move((800 - label-width())/2, 200); } ...二、Qt 内存管理核心对象树机制避免内存泄漏Qt 最具特色的就是 “对象树” 内存管理机制无需手动释放大多数组件大幅简化内存管理。2.1 对象树核心原理父对象与子对象当创建 QObject 子类对象时指定父对象如new QPushButton(this)子对象会自动加入父对象的children()列表自动析构父对象析构时会遍历children()列表自动删除所有子对象避免内存泄漏适用范围所有继承自 QObject 的类如 QWidget、QPushButton、QLabel 等核心组件。2.2 对象树实战验证通过自定义MyLabel类观察构造和析构顺序1、选中工程名鼠标右键-----add new...(或添加新文件)2、选择choose...弹出如下界面;3、点击完成”之后手动创建类的头文件以及源文件会自动添加到目标工程中乱码问题代码展示//mylabel.h #ifndef MYLABEL_H #define MYLABEL_H #include QLabel class MyLabel : public QLabel { public: //构造函数使用带 QWidget* 参数 //这样才能确保我们的对象能够加到对象树上 MyLabel(QWidget* parent); ~MyLabel(); }; #endif // MYLABEL_H //mylabel.cpp #include mylabel.h #include iostream #include QDebug MyLabel::MyLabel(QWidget* parent) :QLabel(parent) //派生类的构造函数需先调用父类构造函数构造父类成员变量再构造子类成员变量 {} MyLabel::~MyLabel() { //std::cout MyLabel 被销毁 std::endl; qDebug() MyLabel 被销毁; } //widget.cpp #include widget.h #include ui_widget.h #include mylabel.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); MyLabel *label new MyLabel(this); label-setText(Hello world!); } Widget::~Widget() { delete ui; }结论子对象标签的析构在父对象窗口析构之后对象树确保所有子组件被自动释放。2.3 避坑指南不要手动删除子对象若手动delete btn父对象析构时会再次删除导致双重释放崩溃优先在构造时指定父对象避免后续通过setParent()设置可能导致析构顺序混乱栈上对象也支持对象树如QPushButton btn(this)析构时同样会被父对象管理。三、编辑框QLineEdit实现helloworld3.1 方式1图形化方式创建helloworld3.2 代码创建helloworld由于编辑框使用纯代码创建helloworld和标签基本一致这里就直接展示代码不过多讲解了//widget.cpp #include widget.h #include ui_widget.h #include QLineEdit Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); QLineEdit* edit new QLineEdit(this); edit-setText(Hello World); } Widget::~Widget() { delete ui; }四、按钮QPushButton实现helloworld4.1 方式1图形化方式创建helloworld通过 Qt Creator 的 UI 设计器拖拽组件无需手动编写布局代码双击项目中的widget.ui文件进入设计模式在左侧 “组件选择区” 找到 “Push Button”拖拽到中间的 UI 设计窗口选中按钮在右侧 “属性设置区” 修改属性text设置按钮文本如 “点击测试”geometry设置位置和大小x100, y100, 宽 120, 高 40objectName设置组件唯一标识如 “myButton”后续代码中可通过ui-myButton访问直接构建运行界面自动生效。依靠一些信号槽代码实现一下按钮的切换(后面会详细讲解这个知识点的)//widget.h #ifndef WIDGET_H #define WIDGET_H #include QWidget QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent nullptr); ~Widget(); void handleClick(); private: Ui::Widget *ui; }; #endif // WIDGET_H //widget.cpp #include widget.h #include ui_widget.h Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); //从ui界面获取到pushButton按钮 connect(ui-pushButton, QPushButton::clicked, this, Widget::handleClick); } Widget::~Widget() { delete ui; } void Widget::handleClick() { //当按钮被点击之后就把按钮中的文本进行切换 if(ui-pushButton-text() QString(Hello world)) { ui-pushButton-setText(Hello Qt); } else { ui-pushButton-setText(Hello world); } }4.2 方式2代码创建helloworld无需依赖.ui文件直接通过代码创建按钮并设置属性适合动态生成组件的场景//widget.h #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); ~Widget(); void handleClick(); private: Ui::Widget *ui; QPushButton* myButton; //关键一步 //因为按下按钮执行的函数操作也需要myButton如果只是在构造函数里面定义则无法在其他函数中使用 //而这些函数都是Widget的成员函数所以可以把这个变量作为成员变量使用 }; #endif // WIDGET_H //widget.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); } Widget::~Widget() { delete ui; } void Widget::handleClick() { if(myButton-text() QString(Hello world)) { myButton-setText(Hello Qt); } else { myButton-setText(Hello world); } }五、Qt 窗口坐标体系Qt 坐标体系是组件布局的基础核心规则如下5.1 核心规则原点0,0窗口左上角坐标轴方向x 轴向右递增y 轴向下递增嵌套组件子组件的坐标相对于父组件的左上角而非屏幕。5.2 常用位置操作函数// 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, 宽, 高5.3 实战示例居中显示组件//widget.cpp #include widget.h #include ui_widget.h #include QPushButton Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); // 让按钮在800x600的窗口中居中 QPushButton *lab new QPushButton(居中显示, 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); } Widget::~Widget() { delete ui; }六、Qt 开发关键技巧与避坑汇总6.1 命名规范类名首字母大写单词间首字母大写如MyPushButton函数名 / 变量名首字母小写单词间首字母大写如setFixedSize、testBtn文件名与类名一致如MyPushButton.h、MyPushButton.cpp。6.2 常用快捷键Ctrl/快速注释 / 取消注释CtrlR运行项目CtrlB构建项目编译F4在.h 和.cpp 文件间快速切换F1打开选中类 / 函数的官方文档优先看英文文档准确性更高CtrlI代码自动对齐。6.3 帮助文档使用Qt 帮助文档是最佳学习资料三种打开方式光标选中类名如QPushButton按F1打开 Qt Creator点击左侧 “帮助” 模式找到 Qt 安装目录下的bin\assistant.exe双击打开独立帮助窗口。结束语本篇博客围绕 Qt 入门核心内容展开从 QLabel、QLineEdit、QPushButton 等基础控件的图形化与代码实现到 Qt 对象树内存管理机制、窗口坐标体系系统梳理了新手入门必备的知识点与实用技巧。同时总结了开发中的命名规范、快捷键、帮助文档使用等实用经验帮助大家避开常见开发误区。希望对大家学习Qt能有所收获