在 Qt 开发体系中,Qt Creator 是连接开发者与框架功能的核心桥梁,熟练掌握其操作逻辑能显著提升开发效率。本文将结合一些简单的代码实例,从实战角度展开详细讲解,帮助大家夯实 Qt 开发基础,建立系统化的开发思维。下面就让我们正式开始吧!
通过上期博客我们可以知道,Qt Creator 是 Qt 官方推出的跨平台集成开发环境(IDE),专为 Qt 框架设计,集代码编辑、界面设计、项目构建、程序调试等功能于一体。无论是桌面应用、移动应用还是嵌入式应用开发,Qt Creator 都能提供高效、便捷的开发支持,是 Qt 开发者的首选工具。
启动 Qt Creator 后,首先进入欢迎模式,该模式是开发者快速开展工作的入口,主要包含以下的功能区域:
当打开或新建项目后,Qt Creator 会自动切换至编辑模式,此时界面主要由 “菜单栏”“模式选择栏”“边栏”“代码编辑区”“构建与运行控制区”“输出窗格” 六大模块组成,各模块分工明确,协同支撑整个开发流程。

菜单栏包含 8 个核心菜单,覆盖了 Qt Creator 的所有操作功能,具体如下表所示:
菜单名称 | 核心功能 |
|---|---|
文件(File) | 新建 / 打开 / 关闭项目 / 文件、保存文件、打印、退出 IDE 等基础文件操作 |
编辑(Edit) | 撤销 / 重做、剪切 / 复制 / 粘贴、查找 / 替换、代码格式化(Ctrl+I)、编码格式设置等编辑功能 |
构建(Build) | 构建项目(Ctrl+B)、清理构建文件、运行项目(Ctrl+R)等与项目编译运行相关的操作 |
调试(Debug) | 启动调试(F5)、设置断点(F9)、单步执行(F10)、进入函数(F11)、查看调试变量等调试功能 |
分析器(Analyze) | 包含 QML 分析器、Valgrind 内存分析器、性能分析器等工具,用于排查内存泄漏、优化程序性能 |
工具(Tools) | 提供 “选项”(配置 IDE 环境)、“外部工具”(集成第三方工具)、“版本控制”(如 Git 集成)等功能 |
控件(Window) | 控制界面布局,如显示 / 隐藏边栏(Alt+0)、调整输出窗格位置、切换全屏模式等 |
帮助(Help) | 打开 Qt 帮助文档(F1)、查看 Qt Creator 版本信息、管理插件等帮助类操作 |
模式选择栏位于界面左侧,包含了 6 种模式,点击即可切换至对应的工作场景,满足不同开发阶段的需求:
QPushButton的用法、QApplication的构造函数参数等。边栏位于代码编辑区左侧,可通过 “控件” 菜单中的 “Show Left Sidebar”(快捷键 Alt+0)显示或隐藏。边栏包含多个功能视图,常用视图如下:



Widget类的构造函数、析构函数以及从父类QWidget继承的成员函数,方便快速定位类的定义与实现。代码编辑区是开发者编写代码的核心区域,Qt Creator 为其提供了丰富的功能,大幅提升编码效率:

该区域位于界面的左下角,包含了 4 个功能,是控制项目构建、运行、调试的关键:


输出窗格位于界面底部,包含了 7 个窗口(快捷键 Alt+1~Alt+7),分别展示不同开发阶段的信息:
<QPushButton>,会提示 “undefined reference to QPushButton::QPushButton(...)”,点击错误信息可快速定位到对应的代码行。qDebug()打印的日志、程序异常提示等。例如,在代码中添加qDebug() << "程序启动成功";,运行后该窗口会显示对应的日志信息,方便开发者调试程序逻辑。print variable查看变量值),或查看调试器输出的信息,适合高级调试场景。新建项目是 Qt 开发的第一步,这里我们以创建 “Qt Widgets Application”(基于 Qt Widgets 组件的图形界面应用)为例,详细步骤如下:




构建系统用于生成项目的编译脚本(如 Makefile),Qt 支持 qmake、CMake、Qbs 三种构建系统:
此处选择默认的 “qmake”,点击 “下一步(N)”。

这三种类之间的关系如下图所示:

此处选择默认的 “QWidget”,勾选 “Generate form”(生成 UI 设计文件),点击 “下一步(N)”。

该步骤用于设置项目的国际化支持,若暂时不需要多语言版本(如仅支持中文),直接选择 “<none>”,点击 “下一步(N)”。

默认会显示已安装的 Qt 构建套件(如 “Desktop Qt 5.14.2 MinGW 64-bit”),直接勾选该套件,点击 “下一步(N)”。

在 “项目管理” 界面,默认不添加版本控制系统(后续可手动集成 Git),点击 “完成(F)”,Qt Creator 会自动生成项目文件,并进入编辑模式。

项目创建完成后,在 “项目视图” 中可看到生成的核心文件:QtHelloWorld.pro(项目配置文件)、main.cpp(主函数文件)、widget.h(头文件)、widget.cpp(源文件)、widget.ui(UI 设计文件)。

Hello World 程序是学习任何编程语言或框架的经典入门案例,通过实现一个简单的 “Hello Qt” 界面,可快速掌握 Qt 的基本开发流程、界面创建方式与程序运行逻辑。Qt 中实现 Hello World 有两种核心方式:纯代码方式(手动编写界面代码)和可视化操作方式(通过 Qt Creator 设计模式拖拽组件),两种方式各有优势,适用于不同场景。
纯代码方式需要手动创建控件、设置控件属性(如文本、位置)并将控件添加到窗口中,适合深入理解 Qt 控件的创建与管理逻辑。以创建一个包含 “Hello Qt” 按钮的窗口为例,步骤如下:
widget.cpp文件,进入代码编辑区。Widget类的构造函数中添加以下代码:#include "widget.h"
#include "ui_widget.h"
// 包含QPushButton控件的头文件(使用按钮控件必须包含)
#include <QPushButton>
// 包含qDebug()日志打印的头文件(可选,用于调试)
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this); // 初始化UI界面(即使不使用可视化设计,也需保留该语句)
// 1. 创建QPushButton对象,参数1为按钮显示文本,参数2为父对象(当前窗口)
QPushButton *helloBtn = new QPushButton("Hello Qt", this);
// 2. 设置按钮的位置(相对于父窗口左上角,x轴向右为正,y轴向下为正)
// move(x, y):x表示水平位置,y表示垂直位置
helloBtn->move(150, 100);
// 3. 设置按钮的固定大小(宽度,高度)
// 若不设置,按钮会根据文本自动调整大小
helloBtn->setFixedSize(120, 40);
// 4. (可选)设置窗口的固定大小,避免窗口可随意拉伸导致控件位置错乱
this->setFixedSize(400, 250);
// 5. (可选)设置窗口标题
this->setWindowTitle("Qt Hello World");
// 6. (可选)打印调试日志,验证按钮创建成功
qDebug() << "Hello Qt按钮创建成功,位置:" << helloBtn->pos()
<< ",大小:" << helloBtn->size();
}
Widget::~Widget()
{
delete ui; // 释放UI对象内存,避免内存泄漏
}QPushButton控件必须包含头文件<QPushButton>,Qt 中每个控件类都对应一个独立的头文件,类名与头文件名一致(如QLabel对应<QLabel>,QLineEdit对应<QLineEdit>)。new QPushButton("Hello Qt", this)创建按钮对象,第二个参数this表示将当前Widget窗口作为按钮的父对象。根据 Qt 的对象树机制(后续会为大家详细介绍),当父对象(窗口)被析构时,子对象(按钮)会自动被析构,无需手动调用delete,避免内存泄漏。move(150, 100):设置按钮在父窗口中的位置,(150, 100) 表示按钮左上角距离窗口左上角水平 150 像素、垂直 100 像素。setFixedSize(120, 40):设置按钮的固定大小为宽 120 像素、高 40 像素,若使用resize(120, 40),按钮大小可后续被修改,而setFixedSize会锁定大小。setWindowTitle("Qt Hello World"):设置窗口标题,显示在窗口顶部标题栏。qDebug()是 Qt 提供的日志打印函数,类似 C++ 的cout,但支持更丰富的输出格式(如直接打印 Qt 对象的属性),输出内容会显示在 “应用程序输出” 窗口中。
Hello Qt按钮创建成功,位置: QPoint(150,100) ,大小: QSize(120,40),验证按钮创建与属性设置正确。可视化操作方式通过 Qt Creator 的设计模式拖拽组件创建界面,无需手动编写界面布局代码,适合快速构建复杂界面,是 Qt 开发中常用的方式。以实现与纯代码方式相同的 “Hello Qt” 窗口为例,步骤如下:
在 “项目视图” 中,双击widget.ui文件,Qt Creator 会自动切换至设计模式,界面分为 “组件选择窗口”“UI 设计窗口”“属性设置窗口”“对象浏览窗口” 四大模块:


x=150, y=100, 宽度=120, 高度=40)。

实现方式 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
纯代码方式 | 1. 深入理解控件创建与属性设置逻辑; 2. 灵活度高,支持动态创建控件(如根据数据生成多个按钮); 3. 无需依赖 UI 设计文件 | 1. 代码量较大,复杂界面编写效率低; 2. 界面布局调整需手动修改代码,直观性差 | 1. 学习 Qt 控件基础原理; 2. 动态生成控件的场景(如列表展示); 3. 简单界面或小型项目 |
可视化方式 | 1. 直观性强,拖拽即可创建界面,无需编写布局代码; 2. 界面调整方便,所见即所得; 3. 复杂界面(如多控件布局)开发效率高 | 1. 对 UI 设计文件依赖度高,手动修改 UI 文件(XML 格式)易出错; 2. 动态创建控件需结合代码,灵活性稍差 | 1. 快速构建复杂界面; 2. 界面布局频繁调整的场景; 3. 企业级项目或团队协作开发 |
在实际开发中,两种方式常结合使用:通过可视化方式创建静态界面框架,通过代码实现动态逻辑(如控件点击事件、数据加载等)。
除了按钮控件,标签控件(QLabel)也是实现 Hello World 的常用方式,QLabel主要用于显示文本、图片等静态内容。以下通过纯代码方式实现一个显示 “中华人民共和国万岁” 蓝色文本的窗口:
在widget.cpp的Widget构造函数中添加以下代码:
#include "widget.h"
#include "ui_widget.h"
#include <QLabel> // 包含标签控件头文件
#include <QFont> // 包含字体设置头文件
#include <QColor> // 包含颜色设置头文件
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 创建QLabel对象,父对象为当前窗口
QLabel *helloLabel = new QLabel(this);
// 2. 设置标签显示的文本
helloLabel->setText("中华人民共和国万岁");
// 3. 设置窗口固定大小
this->setFixedSize(1000, 600);
// 4. 设置标签文本的字体(字体名称、字号、字体样式)
QFont labelFont("华文行楷", 64, QFont::Bold); // 华文行楷字体,64号,加粗
helloLabel->setFont(labelFont);
// 5. 设置标签文本的颜色(蓝色)
// 使用样式表(CSS-like)设置颜色,Qt控件均支持样式表
helloLabel->setStyleSheet("color: blue;");
// 6. 设置标签的位置(水平居中,垂直居中)
// 计算标签位置:窗口宽度/2 - 标签宽度/2,窗口高度/2 - 标签高度/2
int labelX = (this->width() - helloLabel->width()) / 2;
int labelY = (this->height() - helloLabel->height()) / 2;
helloLabel->move(labelX, labelY);
// 7. 设置窗口标题
this->setWindowTitle("Qt Hello World(标签版)");
}
Widget::~Widget()
{
delete ui;
}运行程序后,会弹出一个 1000×600 像素的窗口,窗口中央显示蓝色、64 号 “华文行楷” 字体的 “中华人民共和国万岁” 文本,效果如下图所示:

QFont类用于设置文本字体,构造函数参数分别为 “字体名称”“字号”“字体样式”(如QFont::Bold表示加粗,QFont::Italic表示斜体)。setStyleSheet方法使用样式表设置颜色,样式表语法类似 CSS,除了颜色,还可设置背景色、边框等(如"background-color: white; border: 1px solid gray;")。QVBoxLayout、QHBoxLayout)。Qt 项目包含多种类型的文件,每种文件都有其特定的功能与格式规范,深入理解这些文件的结构,是掌握 Qt 项目组织方式、排查工程问题的关键。接下来我以 “QtHelloWorld” 项目为例,详细解析核心文件的内容与作用。
.pro文件是 Qt 项目的核心配置文件,由 qmake 工具解析,用于生成项目的编译脚本(如 Makefile、Visual Studio 项目文件)。该文件记录了项目依赖的 Qt 模块、源文件、头文件、UI 文件等关键信息,是项目构建的 “指挥中心”。
“QtHelloWorld.pro” 文件的默认内容如下:
# 1. 引入Qt核心模块:core(核心功能,如信号与槽、对象树)、gui(图形界面基础功能)
QT += core gui
# 2. 条件判断:若Qt主版本号大于4(即Qt 5及以上版本),需额外引入widgets模块
# Qt 5中将 widgets 模块从 gui 中拆分,使用Qt Widgets控件必须引入该模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 3. 指定生成的应用程序名称(Windows系统生成QtHelloWorld.exe,Linux生成QtHelloWorld)
TARGET = QtHelloWorld
# 4. 指定项目模板类型:app表示生成应用程序(默认模板)
# 其他模板类型:lib(生成库文件)、subdirs(生成子目录项目)、vcapp(生成Visual Studio应用项目)
TEMPLATE = app
# 5. 指定项目包含的源文件(.cpp文件),多个文件用反斜杠“\”分隔(或换行分隔)
SOURCES += main.cpp\
widget.cpp
# 6. 指定项目包含的头文件(.h文件)
HEADERS += widget.h
# 7. 指定项目包含的UI设计文件(.ui文件),qmake会自动将.ui文件转换为C++代码(生成ui_widget.h)
FORMS += widget.ui
# (可选)启用C++11特性,支持 nullptr、lambda表达式等新语法
# CONFIG += c++11
# (可选)指定项目包含的资源文件(.qrc文件,如图片、音频等资源)
# RESOURCES += res.qrc模块引入:使用QT += 模块名引入项目依赖的 Qt 模块,常用模块如下:
core:Qt 核心模块,提供对象模型、事件循环、容器类等基础功能,所有 Qt 项目都必须引入。gui:图形界面基础模块,提供绘图、字体、颜色等功能,图形界面项目必须引入。widgets:Qt Widgets 控件模块,提供按钮、标签、文本框等传统控件,使用这些控件必须引入。network:网络模块,提供 TCP/IP、UDP 等网络通信功能,网络编程项目需引入。sql:数据库模块,提供 MySQL、SQLite 等数据库的操作接口,数据库项目需引入。charts:图表模块,提供折线图、柱状图、饼图等图表绘制功能,数据可视化项目需引入。
条件判断:使用greaterThan“lessThan”“equals” 等函数实现条件判断,语法格式为:
条件函数(参数1, 参数2): 执行语句例如,greaterThan(QT_MAJOR_VERSION, 4): QT += widgets表示 “若 Qt 主版本号大于 4,则引入 widgets 模块”,该语句保证了项目在 Qt 4 和 Qt 5 版本下的兼容性。
目标名称:TARGET指定生成的应用程序或库的名称,若需生成库文件(TEMPLATE = lib),则生成的库文件名为libQtHelloWorld.so(Linux)或QtHelloWorld.dll(Windows)。
文件列表:
SOURCES:指定源文件(.cpp),qmake 会将这些文件编译为目标文件(.o 或.obj)。HEADERS:指定头文件(.h),qmake 会确保头文件被正确包含在项目中,且在头文件修改时触发重新编译。FORMS:指定 UI 设计文件(.ui),qmake 会调用 uic 工具(UI Compiler)将.ui 文件转换为 C++ 头文件(如ui_widget.h),该头文件包含 UI 界面的初始化代码。RESOURCES:指定资源文件(.qrc),qmake 会将资源文件编译为二进制数据,嵌入到可执行文件中,避免资源文件丢失。配置选项:使用CONFIG += 选项添加项目配置,常用选项如下:
c++11/c++17:启用对应的 C++ 标准,支持新语法特性。debug/release:指定默认构建类型为 Debug 或 Release。console:在 Windows 系统中,使应用程序运行时显示控制台窗口(方便查看qDebug()日志)。头文件用于声明类、函数、变量等,是 Qt 项目的 “接口文件”,其他文件通过包含头文件使用其中声明的内容。以 “widget.h” 为例,其核心内容如下:
#ifndef WIDGET_H
#define WIDGET_H
// 包含基类QWidget的头文件,Widget类继承自QWidget
#include <QWidget>
// 1. 声明UI命名空间:由uic工具根据widget.ui文件自动生成
// 命名空间内包含Widget类,用于访问UI界面中的控件
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
// 2. 自定义Widget类,继承自QWidget
class Widget : public QWidget
{
Q_OBJECT // 3. 启用Qt信号与槽机制的宏,必须添加到使用信号与槽的类中
public:
// 4. 构造函数:parent为父对象指针,默认值为nullptr(无父对象)
Widget(QWidget *parent = nullptr);
// 5. 析构函数:用于释放类的成员变量(如ui指针)
~Widget();
private:
// 6. 指向UI界面的指针:用于访问widget.ui中设计的控件(如按钮、标签)
Ui::Widget *ui;
};
#endif // WIDGET_H#ifndef、#define、#endif 预处理指令(俗称 “头文件保护宏”),避免头文件被多次包含导致的编译错误。例如,#ifndef WIDGET_H表示 “若 WIDGET_H 未定义”,#define WIDGET_H表示 “定义 WIDGET_H”,#endif表示 “结束条件判断”。
QT_BEGIN_NAMESPACE与QT_END_NAMESPACE之间的代码声明了Ui命名空间,该命名空间由 uic 工具根据widget.ui文件自动生成。命名空间内的Widget类包含了 UI 界面中所有控件的指针(如pushButton)和初始化函数(setupUi),开发者通过ui指针访问这些控件。
Widget类继承自QWidget,QWidget是 Qt 中所有可视化控件的基类,提供了窗口显示、事件处理等基础功能。根据项目需求,基类可更换为QMainWindow(主窗口类)或QDialog(对话框类)。
Ui::Widget *ui是指向 UI 界面的指针,在widget.cpp的构造函数中通过ui = new Ui::Widget初始化,通过ui->setupUi(this)加载 UI 界面。后续访问 UI 控件时,需通过ui->控件名称的方式(如ui->pushButton->setText("Hello Qt"))。
main.cpp是 Qt 应用程序的入口文件,包含 C++ 标准的main函数,是程序启动的 “第一站”。该文件的核心作用是创建应用程序对象、初始化主窗口并启动事件循环。
// 1. 包含主窗口类Widget的头文件
#include "widget.h"
// 2. 包含Qt应用程序类QApplication的头文件
#include <QApplication>
// 3. 程序入口函数:argc为命令行参数个数,argv为命令行参数数组
int main(int argc, char *argv[])
{
// 4. 创建QApplication对象a:每个Qt图形界面应用程序必须有且仅有一个QApplication对象
// 该对象负责管理应用程序的控制流、事件循环、全局资源等
QApplication a(argc, argv);
// 5. 创建主窗口对象w:Widget是自定义的主窗口类
Widget w;
// 6. 显示主窗口:Qt窗口默认处于隐藏状态,必须调用show()函数才能显示
w.show();
// 7. 启动应用程序事件循环:程序进入等待状态,响应用户操作(如点击按钮、关闭窗口)
// 事件循环结束后,exec()函数返回,程序退出
return a.exec();
}QApplication 类:是 Qt 应用程序的核心管理类,主要功能包括:
argc和argv参数传递命令行参数,可通过QApplication::arguments()函数获取参数列表。注意:若开发控制台应用程序(无图形界面),需使用QCoreApplication类替代QApplication,QCoreApplication不依赖图形界面库,体积更小。
主窗口对象创建:Widget w创建主窗口对象,若需在堆上创建对象(支持动态内存管理),可改为:
Widget *w = new Widget;
w->show();此时是不需要手动释放w的内存的,因为QApplication会在程序退出时自动清理未释放的顶层窗口对象(无父对象的窗口)。
show () 函数:用于显示窗口,Qt 提供多种显示函数:
show():普通显示,窗口大小由sizeHint()(默认大小)或resize()设置决定。showMaximized():最大化显示窗口。showMinimized():最小化显示窗口。showFullScreen():全屏显示窗口(常用于游戏、播放器等场景)。事件循环(a.exec ()):exec()函数启动应用程序的事件循环,程序进入 “等待 - 响应” 状态:
QPushButton处理)。QApplication::quit()函数时,事件循环结束,exec()函数返回,程序退出。 widget.h是Widget类的声明文件,widget.cpp是Widget类的实现文件,两者配合完成主窗口的功能逻辑。
// 1. 包含Widget类的头文件
#include "widget.h"
// 2. 包含UI界面自动生成的头文件:由uic工具根据widget.ui文件生成
#include "ui_widget.h"
// 3. Widget类构造函数实现:parent为父对象指针
Widget::Widget(QWidget *parent)
: QWidget(parent) // 调用父类QWidget的构造函数
, ui(new Ui::Widget) // 初始化ui指针,创建Ui::Widget对象
{
// 4. 初始化UI界面:加载widget.ui中设计的控件并设置到当前窗口
ui->setupUi(this);
// 5. 自定义功能逻辑:如创建控件、设置信号与槽等
// (此处省略自定义代码)
}
// 6. Widget类析构函数实现:释放ui指针指向的内存
Widget::~Widget()
{
delete ui;
}Ui::Widget类的定义,该类包含:
pushButton(对应 UI 设计中的按钮)、label(对应标签)等。setupUi(QWidget *parent)函数:用于将 UI 控件添加到父窗口(parent)并设置控件的布局、属性等。 开发者无需手动修改ui_widget.h文件,当修改widget.ui文件后,qmake 会自动重新生成该文件。
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)使用初始化列表初始化父类和成员变量,这种方式比在构造函数体内初始化更高效,且是常量成员变量、引用成员变量的唯一初始化方式。
delete ui释放ui指针指向的Ui::Widget对象内存,避免内存泄漏。根据 Qt 的对象树机制,ui对象管理的控件(如按钮、标签)会随ui对象的析构而自动释放,无需手动处理。
.ui文件是 Qt 可视化界面设计的存储文件,采用 XML 格式记录界面中控件的类型、属性、布局关系等信息。该文件由 Qt Creator 设计模式自动生成和维护,开发者无需手动编辑,但了解其结构有助于排查界面布局问题。
“widget.ui” 文件的简化内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<!-- 1. 声明UI对应的类名:Widget -->
<class>Widget</class>
<!-- 2. 主窗口控件:class为QWidget,name为Widget(与自定义类名一致) -->
<widget class="QWidget" name="Widget">
<!-- 3. 主窗口属性:geometry(位置与大小)、windowTitle(窗口标题) -->
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>250</height>
</rect>
</property>
<property name="windowTitle">
<string>Qt Hello World</string>
</property>
<!-- 4. 按钮控件:class为QPushButton,name为pushButton -->
<widget class="QPushButton" name="pushButton">
<!-- 按钮属性:位置、大小、显示文本 -->
<property name="geometry">
<rect>
<x>150</x>
<y>100</y>
<width>120</width>
<height>40</height>
</rect>
</property>
<property name="text">
<string>Hello Qt</string>
</property>
</widget>
</widget>
<!-- 5. 资源引用:此处无资源,为空 -->
<resources/>
<!-- 6. 信号与槽关联:此处无关联,为空 -->
<connections/>
</ui>根节点<ui>:指定 UI 文件的版本(如version="4.0"),是所有其他节点的父节点。
<class>节点:指定 UI 对应的类名,与自定义的Widget类名一致,确保ui指针能正确关联到自定义窗口。
<widget>节点:表示一个控件,通过class属性指定控件类型(如QWidget、QPushButton),通过name属性指定控件名称(用于在代码中访问控件,如ui->pushButton)。
<property>节点:表示控件的属性,通过name属性指定属性名称(如geometry、windowTitle、text),通过子节点(如<rect>、<string>)指定属性值。
<resources>节点:用于引用资源文件(.qrc),如图片、图标等,格式如下:
xml
<resources>
<include location="res.qrc"/>
</resources><connections>节点:用于定义控件的信号与槽关联(这一部分知识在后续也会为大家详细介绍),如按钮点击后触发窗口关闭,格式如下:
<connections>
<connection>
<sender>pushButton</sender> <!-- 信号发送者:按钮 -->
<signal>clicked()</signal> <!-- 发送的信号:点击事件 -->
<receiver>Widget</receiver> <!-- 信号接收者:主窗口 -->
<slot>close()</slot> <!-- 接收者的槽函数:关闭窗口 -->
</connection>
</connections> 当项目构建时,uic 工具会解析.ui文件,生成对应的 C++ 头文件(如ui_widget.h),该头文件包含Ui::Widget类的实现,其中setupUi函数会根据 XML 节点的信息创建控件、设置属性并关联信号与槽。
Qt 开发有其独特的机制与规范(如对象树、信号与槽、命名规范等),掌握这些注意事项,是避免常见错误、提升代码质量与开发效率的关键。在这里博主就从命名规范、快捷键、帮助文档使用、对象树、坐标体系五个方面展开讲解。
良好的命名规范能提高代码的可读性与可维护性,Qt 推荐使用驼峰命名法,具体规范如下:
元素类型 | 命名规则 | 示例 |
|---|---|---|
类名 | 首字母大写,单词之间首字母大写(帕斯卡命名法) | Widget、MyPushButton、MainWindow |
函数名 | 首字母小写,单词之间首字母大写 | setText()、setFixedSize()、showMaximized() |
变量名 | 首字母小写,单词之间首字母大写;成员变量可加前缀 “m_” 区分 | helloBtn、m_windowTitle、userName |
常量名 | 全大写,单词之间用下划线分隔 | MAX_WIDTH、DEFAULT_FONT_SIZE、ERROR_CODE |
宏定义 | 全大写,单词之间用下划线分隔 | Q_OBJECT、QT_DEBUG、MAX_BUFFER_SIZE |
文件名 | 与类名一致,首字母大写;源文件为.cpp,头文件为.h | Widget.h、Widget.cpp、MyPushButton.h |
熟练使用快捷键能大幅减少鼠标操作,提升编码与调试效率。Qt Creator 提供了丰富的快捷键,以下是开发中最常用的快捷键:
功能 | 快捷键 | 说明 |
|---|---|---|
注释代码 | Ctrl + / | 单行注释:在选中代码行前添加 “//”;再次按下取消注释 |
运行项目 | Ctrl + R | 构建并运行项目;若项目未修改,直接运行上次构建的可执行文件 |
构建项目 | Ctrl + B | 仅构建项目(编译源代码、链接库),不运行 |
启动调试 | F5 | 启动调试模式,程序运行至第一个断点处暂停 |
设置断点 | F9 | 在当前代码行设置 / 取消断点(断点显示为红色圆点) |
单步执行 | F10 | 调试时单步执行,不进入函数内部(跳过函数) |
进入函数 | F11 | 调试时单步执行,进入函数内部 |
跳出函数 | Shift + F11 | 调试时从当前函数中跳出,回到调用函数的位置 |
查找文本 | Ctrl + F | 在当前文件中查找文本,支持正则表达式 |
替换文本 | Ctrl + R | 在当前文件中替换文本,支持批量替换 |
代码格式化 | Ctrl + I | 自动对齐选中的代码,使代码格式整齐(遵循 Qt 代码风格) |
头文件 / 源文件切换 | F4 | 在当前类的.h文件与.cpp文件之间快速切换 |
添加书签 | Ctrl + M | 在当前代码行添加 / 取消书签,方便后续快速跳转 |
查看帮助文档 | F1 | 查看光标所在类、函数或关键字的帮助文档(如光标在QPushButton上,按 F1 查看其用法) |
字体缩放 | Ctrl + 鼠标滚轮 | 放大 / 缩小代码编辑区的字体大小,适应不同屏幕分辨率 |
显示 / 隐藏边栏 | Alt + 0 | 显示或隐藏左侧边栏,扩大代码编辑区空间 |
Qt 提供了完善的官方帮助文档,包含类库说明、API 文档、示例代码、开发指南等内容,是解决开发问题、学习 Qt 功能的核心资源。掌握帮助文档的使用方法,能让大家在遇到问题时快速找到解决方案。
QPushButton上按 F1,会显示QPushButton类的详细说明(包含构造函数、成员函数、信号与槽、示例代码等)。


bin文件夹(如D:\Development_Software\Qt\5.14.2\mingw73_64\bin),双击assistant.exe,启动独立的 Qt 助手。该工具功能与 Qt Creator 的帮助模式一致,但可独立于 Qt Creator 运行,适合在编写代码时同时查阅文档。

以QPushButton类的帮助文档为例,其核心内容包括:
<QPushButton>)和依赖的 Qt 模块(如QT += widgets)。QPushButton继承自QAbstractButton,QAbstractButton继承自QWidget)。setText(const QString &text)用于设置按钮文本)。clicked()按钮点击信号)和槽函数(如setEnabled(bool enabled)设置按钮是否可用)。Qt 的英文帮助文档内容全面、更新及时且翻译准确,而中文文档往往存在翻译滞后、内容缺失或翻译错误等问题。因此,强烈建议开发者使用英文帮助文档,这不仅能获取准确的信息,还能提升英文技术文档的阅读能力,为后续学习其他开源框架打下基础。
若英文基础较弱,可结合翻译工具(如 DeepL、Google 翻译)辅助阅读,但同时也需要注意技术术语的准确性。
Qt 中引入了对象树(Object Tree) 机制来管理 QObject 子类对象的生命周期,该机制能自动释放对象内存,大幅简化内存管理,但也存在一些需要注意的细节,若使用不当可能导致内存泄漏或程序崩溃。
parent参数指定父对象。子对象会自动添加到父对象的children()列表中,形成树形结构(对象树)。children()列表,析构所有子对象;若子对象被手动析构(如delete child),会自动从父对象的children()列表中移除,避免父对象析构时重复释放。
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 1. 创建顶层对象(主窗口):无父对象
QWidget *mainWindow = new QWidget;
mainWindow->setWindowTitle("对象树示例");
mainWindow->resize(400, 250);
// 2. 创建子对象(按钮):父对象为主窗口
QPushButton *btn = new QPushButton("点击我", mainWindow);
btn->move(150, 100);
// 3. 显示主窗口
mainWindow->show();
// 4. 事件循环结束后,手动释放顶层对象mainWindow
// 释放mainWindow时,会自动析构其子对象btn,无需手动delete btn
int ret = a.exec();
delete mainWindow;
return ret;
}#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 错误:栈上创建子对象btn,后设置父对象mainWindow
QPushButton btn("点击我"); // 栈上创建,生命周期由函数作用域控制
QWidget mainWindow; // 栈上创建主窗口
btn.setParent(&mainWindow); // 设置父对象
mainWindow.show();
return a.exec();
}错误原因:栈上对象的析构顺序与创建顺序相反。mainWindow后创建,先析构,析构时会自动释放子对象btn;btn先创建,后析构,导致btn被析构两次,程序崩溃。
避免方法:优先在堆上创建 QObject 子类对象(使用new),并在构造时指定父对象。
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget *mainWindow = new QWidget;
QPushButton *btn = new QPushButton("点击我", mainWindow);
// 错误:手动释放子对象btn,未从mainWindow的children()列表移除
delete btn;
mainWindow->show();
int ret = a.exec();
delete mainWindow; // mainWindow析构时,会再次尝试释放btn,导致程序崩溃
return ret;
}错误原因:delete btn会释放btn的内存,但不会自动从mainWindow的children()列表移除;mainWindow析构时,会再次遍历children()列表释放btn,导致重复析构。
避免方法:若需手动释放子对象,先调用btn->setParent(nullptr)将其从父对象列表移除,再delete btn。
Qt 的窗口坐标体系决定了控件在窗口中的位置与大小,理解该体系是正确布局控件、实现界面效果的基础。

Qt 中提供了一系列函数用于获取或设置控件的坐标与大小,常用函数如下:
函数 | 功能 |
|---|---|
x() / y() | 获取控件左上角相对于父控件的 X/Y 坐标 |
pos() | 获取控件左上角相对于父控件的坐标,返回QPoint(x, y) |
move(int x, int y) / move(const QPoint &p) | 设置控件左上角相对于父控件的坐标 |
width() / height() | 获取控件的宽度 / 高度 |
size() | 获取控件的大小,返回QSize(width, height) |
resize(int w, int h) / resize(const QSize &s) | 设置控件的宽度与高度 |
setFixedSize(int w, int h) / setFixedSize(const QSize &s) | 设置控件的固定大小,后续无法通过resize()修改 |
geometry() | 获取控件相对于父控件的位置与大小,返回QRect(x, y, width, height) |
setGeometry(int x, int y, int w, int h) | 同时设置控件的位置(x, y)与大小(w, h) |
rect() | 获取控件的内部矩形(相对于自身左上角),返回QRect(0, 0, width, height) |
#include <QWidget>
#include <QPushButton>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 1. 创建主窗口:坐标(100, 100),大小(400, 250)
QWidget mainWindow;
mainWindow.move(100, 100);
mainWindow.resize(400, 250);
mainWindow.setWindowTitle("坐标体系示例");
// 2. 创建按钮1:相对于主窗口坐标(50, 50),大小(120, 40)
QPushButton btn1("按钮1", &mainWindow);
btn1.move(50, 50);
btn1.resize(120, 40);
// 3. 创建按钮2:相对于主窗口坐标(230, 50),大小(120, 40)
QPushButton btn2("按钮2", &mainWindow);
btn2.setGeometry(230, 50, 120, 40); // 同时设置位置与大小
// 4. 打印控件的坐标与大小信息
qDebug() << "主窗口位置:" << mainWindow.pos() << ",大小:" << mainWindow.size();
qDebug() << "按钮1位置:" << btn1.pos() << ",大小:" << btn1.size();
qDebug() << "按钮2位置:" << btn2.pos() << ",大小:" << btn2.size();
mainWindow.show();
return a.exec();
}在应用程序输出窗口的运行结果如下:
主窗口位置: QPoint(100,100) ,大小: QSize(400,250)
按钮1位置: QPoint(50,50) ,大小: QSize(120,40)
按钮2位置: QPoint(230,50) ,大小: QSize(120,40)注意事项:
x()/y()获取的是窗口边框左上角的坐标,而控件的坐标是相对于窗口的 “客户区”(不含边框)左上角。若需获取客户区的坐标,可使用mainWindow.frameGeometry()获取窗口边框的矩形,mainWindow.geometry()获取客户区的矩形。QApplication::setAttribute(Qt::AA_EnableHighDpiScaling)启用高 DPI 缩放,确保界面在不同分辨率屏幕上显示正常。QVBoxLayout垂直布局、QHBoxLayout水平布局、QGridLayout网格布局),实现控件的自动排列与自适应。Qt 开发的学习之路是循序渐进的,后续我们还将继续深入学习信号与槽机制(Qt 的核心通信方式)、布局管理器(复杂界面自适应)、绘图与动画(自定义界面效果)、网络编程(TCP/UDP 通信)、数据库操作(MySQL/SQLite)等进阶内容。谢谢大家的支持!