Qt 入门实战教程 · 总览与环境搭建
目标:能独立写出带界面的小程序,理解 Qt 的核心机制。
一、学习路线总览
| 模块 | 必学内容 |
|---|---|
| C++ 回顾 | 类与对象、继承多态、指针引用、STL 容器、智能指针、Lambda |
| Qt 基础 | QObject 体系、对象树、内存管理机制 |
| 核心机制 | 信号与槽(Signal/Slot)、事件循环、事件过滤器 |
| 常用控件 | QWidget、QMainWindow、QDialog、布局管理(QHBoxLayout/QVBoxLayout/QGridLayout) |
| 资源系统 | qrc 资源文件、qss 样式表(类似 CSS) |
| 开发环境 | Qt Creator、qmake/CMake、qDebug 调试 |
练习项目:
- 记事本(QTextEdit + 菜单 + 工具栏 + 文件读写)
- 计算器
二、开发环境搭建
2.1 安装 Qt Creator
- 访问 Qt 官网下载 Qt Online Installer(开源版免费)。
- 运行安装器,登录 Qt 账号(没有就注册一个)。
- 选择组件时,至少勾选:
- Qt 6.x(推荐 LTS 版本,如 6.5 / 6.8)
MSVC 2019 64-bit或MinGW 11.2 64-bit(Windows)Desktop gcc 64-bit(Linux)macOS(Mac)
- Developer and Designer Tools
Qt CreatorCMakeNinja
- Qt 6.x(推荐 LTS 版本,如 6.5 / 6.8)
- 等待安装完成。
新手建议:Windows 下选 MinGW 套件,省去单独安装 Visual Studio 的麻烦。
2.2 验证安装
打开 Qt Creator → 工具 → 选项 → Kits,确认至少有一个可用的 Kit(编译器 + Qt 版本 + 调试器)。
三、构建系统:qmake 与 CMake
Qt 项目支持两种构建系统,新项目推荐 CMake,旧项目常见 qmake。
3.1 qmake(.pro 文件)
# hello.pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = hello
TEMPLATE = app
SOURCES += main.cpp \
mainwindow.cpp
HEADERS += mainwindow.h
常用变量:
QT +=:添加模块(如widgets、network、sql)SOURCES/HEADERS/FORMS/RESOURCES:源文件、头文件、ui 文件、资源文件TARGET:生成的可执行文件名TEMPLATE = app:应用程序;lib:库
3.2 CMake(CMakeLists.txt)
cmake_minimum_required(VERSION 3.16)
project(hello VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON) # 自动处理 Q_OBJECT 宏
set(CMAKE_AUTORCC ON) # 自动处理 .qrc 资源
set(CMAKE_AUTOUIC ON) # 自动处理 .ui 文件
find_package(Qt6 REQUIRED COMPONENTS Widgets)
add_executable(hello
main.cpp
mainwindow.cpp
mainwindow.h
)
target_link_libraries(hello PRIVATE Qt6::Widgets)
三个 AUTO 开关是 CMake 写 Qt 的关键,开了之后 .qrc 和 .ui 会自动编译,不需要手动列。
四、qDebug 调试
qDebug() 是 Qt 的标准调试输出,比 std::cout 更方便,支持 Qt 类型直接打印。
4.1 基本用法
#include <QDebug>
/**
* @brief 演示 qDebug 的各种用法
*/
void demoDebug()
{
// 基础输出
qDebug() << "Hello, Qt!";
// 支持 Qt 类型
QString name = "Tom";
int age = 20;
qDebug() << "Name:" << name << "Age:" << age;
// 输出: Name: "Tom" Age: 20
// 取消字符串引号
qDebug().noquote() << "Name:" << name;
// 输出: Name: Tom
// 格式化输出(类似 printf)
qDebug("Score: %d, Ratio: %.2f", 95, 3.14159);
// 其他级别
qInfo() << "普通信息";
qWarning() << "警告";
qCritical() << "严重错误";
// qFatal("致命错误,会终止程序");
}
4.2 打印自定义类型
#include <QDebug>
/**
* @brief 自定义坐标点
*/
struct Point {
int x;
int y;
};
/**
* @brief 重载 qDebug 输出运算符,让 Point 可直接打印
* @param debug qDebug 流
* @param p 坐标点
* @return qDebug 流(支持链式调用)
*/
QDebug operator<<(QDebug debug, const Point &p)
{
debug.nospace() << "Point(" << p.x << ", " << p.y << ")";
return debug.space();
}
// 使用
Point p{10, 20};
qDebug() << p; // 输出: Point(10, 20)
4.3 在 Qt Creator 中查看
qDebug 输出会显示在 Qt Creator 底部的 应用程序输出 面板(快捷键 Alt+3)。
五、第一个 Qt 程序:Hello World
5.1 项目结构
hello/
├── CMakeLists.txt
└── main.cpp
5.2 main.cpp
#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
/**
* @brief 程序入口
* @param argc 命令行参数个数
* @param argv 命令行参数数组
* @return 程序退出码
*/
int main(int argc, char *argv[])
{
// 1. 创建 QApplication,管理应用程序生命周期和事件循环
QApplication app(argc, argv);
// 2. 创建主窗口(QWidget 是所有界面元素的基类)
QWidget window;
window.setWindowTitle("Hello Qt");
window.resize(300, 200);
// 3. 创建布局,让控件自动排列
QVBoxLayout *layout = new QVBoxLayout(&window);
// 4. 创建标签和按钮
QLabel *label = new QLabel("Hello, Qt!", &window);
label->setAlignment(Qt::AlignCenter);
QPushButton *btn = new QPushButton("点我", &window);
// 5. 信号与槽:点击按钮时修改标签文字
QObject::connect(btn, &QPushButton::clicked, [label]() {
static int count = 0;
label->setText(QString("被点了 %1 次").arg(++count));
});
// 6. 把控件加入布局
layout->addWidget(label);
layout->addWidget(btn);
// 7. 显示窗口
window.show();
// 8. 进入事件循环,程序阻塞在这里直到窗口关闭
return app.exec();
}
5.3 编译运行
# 方式一:Qt Creator 中直接点左下角绿色三角形(运行)
# 方式二:命令行
mkdir build && cd build
cmake ..
cmake --build .
./hello # Linux/macOS
# hello.exe # Windows
运行效果:弹出一个窗口,有一行文字和一个按钮,每点一次按钮文字计数加一。
六、核心要点总结
- QApplication 是 Qt 程序的入口,必须在创建任何界面对象之前创建。
- app.exec() 启动事件循环,程序在此阻塞,处理鼠标、键盘、绘制等事件。
- 信号与槽 是 Qt 的核心通信机制,
connect(sender, signal, receiver, slot)。 - qmake 用 .pro,CMake 用 CMakeLists.txt,新项目优先 CMake。
- qDebug() 是最常用的调试手段,支持 Qt 类型直接输出。
- Qt 对象通过父子关系管理内存,子对象会随父对象自动释放(下一章详解)。
下一章:C++ 基础回顾


被折叠的 条评论
为什么被折叠?



