604 字
2 分钟
【QT】入门与构建
2026-06-11

前置知识:事件循环#

事件循环是图形界面程序的核心机制。程序不断接收并分发各类事件(鼠标、键盘、定时器等)到对应对象处理。

Qt 通过 QCoreApplication::exec()QApplication::exec() 启动事件循环。调用后程序进入等待状态,直到调用 quit() 或关闭主窗口才退出。

QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec(); // 进入事件循环

链接库#

Qt 以动态库(.dll.so.dylib)或静态库(.lib.a)形式提供。

方式优点缺点
动态链接可执行文件小,升级库方便部署时需带上 Qt 运行时
静态链接单文件部署,无外部依赖体积大,许可需注意

常用模块(Qt5 命名示例):

  • Qt5Core:核心(信号槽、字符串、容器、事件循环)
  • Qt5Gui:图形(窗口、图像、字体)
  • Qt5Widgets:桌面控件

构建工具:qmake 与 CMake#

工具说明
qmakeQt 传统构建工具,通过 .pro 描述项目,生成 Makefile
CMake跨平台推荐;Qt6 官方主推,与 IDE 集成更好

qmake 示例.pro):

QT += core gui widgets
SOURCES = main.cpp mainwindow.cpp
HEADERS = mainwindow.h

CMake 示例CMakeLists.txt):

cmake_minimum_required(VERSION 3.16)
project(MyQtApp)
find_package(Qt6 REQUIRED COMPONENTS Core Widgets)
qt6_add_executable(MyQtApp main.cpp mainwindow.cpp)
target_link_libraries(MyQtApp Qt6::Core Qt6::Widgets)

Qt6 项目常用 qt6_standard_project_setup()qt6_add_executable();旧版 Qt5 对应 find_package(Qt5 ...)qt5_wrap_ui 等宏。

Qt 概述#

  • 跨平台:Windows、Linux、macOS、Android、iOS 等
  • 模块化:Core、Gui、Widgets、Network、Sql、Multimedia、Qml 等
  • 信号与槽:类型安全的对象间通信
  • 工具链:Qt Designer、Qt Creator、qmake/CMake、QML

跨平台原理#

  1. 平台抽象层(QPA)
    窗口系统、输入、OpenGL 等差异抽象为统一接口;各平台实现插件(如 qwindowsqxcbqcocoa),运行时自动加载。

  2. 自绘机制
    Qt Widgets 多用 QPainter 自绘,外观一致且可用 QSS 定制;不依赖各系统原生控件 API。

  3. 统一 API + 条件编译
    底层按平台调用不同系统 API;平台相关代码用 Q_OS_WINQ_OS_LINUX 等宏隔离。

  4. 跨平台工具链
    qmake/CMake 按目标平台生成 Makefile、Visual Studio 工程等。

构建流程(MOC / UIC / RCC)#

main.cpp
mainwindow.h ──► moc ──► moc_mainwindow.cpp
mainwindow.ui ──► uic ──► ui_mainwindow.h
resources.qrc ──► rcc ──► qrc_resources.cpp
├─────────────────────────────┐
└──► C++ 编译器 + 链接器 ──► 可执行文件
工具全称作用
MOCMeta-Object Compiler处理含 Q_OBJECT 的头文件,生成 moc_*.cpp(信号槽、元对象反射)
UICUI Compiler.ui 转为 ui_*.h,内含 setupUi()
RCCResource Compiler.qrc 转为 qrc_*.cpp,把图片、翻译等嵌入二进制

Q_OBJECT 的类必须经 MOC 处理,否则链接阶段会报 vtablestaticMetaObject 相关错误。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【QT】入门与构建
https://lysj.work/posts/studynotes/qt/qt入门与构建/
作者
Sekiro
发布于
2026-06-11
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录