1、Qt与CMake入门:Qt框架概述、CMake构建系统简介、第一个Qt+CMake项目

1.1 Qt框架到底是什么?

先说说Qt吧。很多新手一上来就被Qt的"跨平台"、"信号槽"这些词吓住了。其实没那么玄乎。

Qt本质上就是一个C++的图形界面框架。说白了,它帮你把窗口、按钮、文本框这些东西封装好了,你直接调用就行。我刚开始学的时候,觉得它跟MFC差不多,但用久了才发现——Qt的设计思路要优雅得多。

Qt的核心能力包括:

  • 跨平台:一套代码,Windows、Linux、macOS都能跑。我在项目中就吃过这个甜头——客户临时要求从Windows切到Linux,我改了几行配置就搞定了。
  • 信号与槽:这是Qt的灵魂机制。对象之间通信不用写回调函数,用connect连接信号和槽就行。嗯,这里要注意:信号和槽的参数类型必须匹配,否则编译不会报错,但运行时会静默失败——我踩过这个坑。
  • 丰富的模块:网络、数据库、XML、OpenGL……基本上你能想到的,Qt都有现成的模块。

一句话总结:Qt = C++ + 图形界面 + 跨平台 + 一堆好用的工具库。

1.2 为什么选CMake?

你可能要问:Qt不是有自己的qmake吗?为什么还要用CMake?

我个人习惯用CMake。原因很简单:CMake是事实上的C++构建标准。qmake虽然简单,但生态太封闭。你想想看,如果项目里既有Qt又有其他第三方库,用qmake管理起来就很痛苦。CMake就不一样了,它几乎能搞定所有C++项目的构建。

CMake的工作流程是这样的:

  1. 你写一个CMakeLists.txt文件,描述项目怎么编译
  2. 运行cmake命令,生成构建文件(比如Makefile或Visual Studio工程)
  3. 运行make或直接编译,生成可执行文件

说白了,CMake就是帮你把"怎么编译"这件事自动化了。我在一个大型项目中,光源文件就有上千个,手动写Makefile会疯掉——CMake救了我一命。

1.3 第一个Qt+CMake项目

光说不练假把式。我们来写一个真正的Qt+CMake项目。这个项目很简单:弹出一个窗口,显示"Hello, Qt!"。

1.3.1 项目结构

先建个文件夹,里面放这些文件:

hello_qt/
├── CMakeLists.txt
├── main.cpp
└── mainwindow.h

就这么简单。三个文件,一个项目。

1.3.2 写CMakeLists.txt

这是CMake的配置文件。我直接给你看代码:

cmake_minimum_required(VERSION 3.16)
project(HelloQt VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 找到Qt的Widgets模块
find_package(Qt5 REQUIRED COMPONENTS Widgets)

# 添加可执行文件
add_executable(hello_qt main.cpp mainwindow.h)

# 链接Qt库
target_link_libraries(hello_Qt Qt5::Widgets)

解释一下关键行:

  • find_package(Qt5 REQUIRED COMPONENTS Widgets):告诉CMake去找Qt5的Widgets模块。如果找不到,编译会直接报错。
  • add_executable:把源文件打包成一个可执行文件。
  • target_link_libraries:把Qt库链接进来。没有这步,你写的Qt代码就找不到对应的函数。

小技巧:如果你用的是Qt6,把Qt5改成Qt6就行。我建议新项目直接用Qt6,毕竟Qt5已经进入维护期了。

1.3.3 写main.cpp

这是程序的入口:

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QLabel label("Hello, Qt!");
    label.show();

    return app.exec();
}

这段代码做了三件事:

  1. 创建了一个QApplication对象——每个Qt程序都必须有它,负责管理全局资源。
  2. 创建了一个QLabel,显示"Hello, Qt!"。
  3. 调用app.exec()进入事件循环——说白了就是让程序一直跑着,直到用户关掉窗口。

注意:QApplication必须在所有Qt对象之前创建。我曾经在构造函数里先创建了窗口再创建app,结果程序直接崩溃——血的教训。

1.3.4 编译运行

打开终端,进入项目目录,执行:

mkdir build
cd build
cmake ..
make
./hello_qt

如果一切顺利,你会看到一个窗口弹出来,上面写着"Hello, Qt!"。

为什么会这样?因为CMake帮你生成了Makefile,make命令根据Makefile去编译代码,最后链接成可执行文件。整个过程你只需要写一个CMakeLists.txt,剩下的交给工具链。

1.4 本章知识体系

下面这张图帮你理清Qt和CMake的关系:

Qt框架 跨平台C++图形界面库 信号槽 | 模块化 | 跨平台 CMake构建系统 跨平台构建工具 CMakeLists.txt | 生成构建文件 配合使用 可执行文件 hello_qt.exe 编译 链接

这张图展示了本章的核心逻辑:Qt提供功能,CMake负责构建,两者结合生成可执行文件。你不需要记住所有细节,只要理解这个流程就够了。

1.5 避坑指南

最后分享几个我踩过的坑:

  • Qt版本不匹配:我曾经在Ubuntu上装了Qt5,但CMake找到的是系统自带的Qt4,结果编译报一堆莫名其妙的错误。解决方案:用cmake -DCMAKE_PREFIX_PATH=/path/to/qt指定Qt路径。
  • 忘记链接库:新手最容易犯的错。写了#include <QWidget>但没在CMakeLists.txt里链接Qt5::Widgets,编译直接报"未定义的引用"。
  • 中文乱码:Qt5默认用UTF-8,但Windows控制台可能是GBK。解决方案:在main.cpp开头加QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));。

核心要点:Qt+CMake的组合是现代C++桌面开发的标配。你不需要成为CMake专家,但至少要能写出一个能用的CMakeLists.txt。本章的内容,够你应付90%的小项目了。

好了,动手试试吧。把代码敲一遍,跑起来,你就算正式入门了。

可可精品资料库