淡若轻风

博客园 首页 新随笔 联系 订阅 管理

当前最新版本

  • 最新稳定版本Qt 6.11.1(2026 年 5 月 13 日发布)
  • 主要版本Qt 6.11(2026 年 3 月 23 日发布)

支持情况(2026 年 6 月):

  • Qt 6.11:标准支持至 2027 年 3 月
  • Qt 6.10:支持至 2026 年 10 月
  • Qt 6.8 LTS(长期支持版):支持至 2029 年 10 月(商业用户推荐用于大型长期项目)

推荐选择

  • 新项目:直接使用 Qt 6.11Qt 6.8 LTS
  • 企业/长期维护项目:优先 Qt 6.8 LTS

Qt 发展历程(1991 年至今)

时间版本主要里程碑与特点
1991 年 - 挪威程序员 Haavard Nord 和 Eirik Chambe-Eng 开始开发
1994 年 - 成立 Trolltech 公司
1995 年 5 月 Qt 0.90 首次公开发布(仅支持 X11/Linux)
1996-2000 年 Qt 1.x / 2.x 支持 Windows,逐渐流行,被 KDE 项目采用
2005 年 Qt 4.0 重大重构,模块化架构,引入更现代的设计
2008 年 - Trolltech 被 Nokia 收购
2012 年 12 月 Qt 5.0 引入 QML + Qt Quick(声明式 UI)、硬件加速图形、大幅现代化
2012-2014 年 - Digia 收购 Qt 业务,后成立 The Qt Company
2020 年 12 月 Qt 6.0 重大架构升级: • 移除大量废弃 API • 现代 C++ 标准支持 • 更好的 3D / 图形性能 • 模块拆分更清晰
2021-2024 年 Qt 6.1 ~ 6.7 持续迭代,强化跨平台、嵌入式、汽车领域支持
2024 年 10 月 Qt 6.8 LTS 重要的长期支持版本,支持至 2029 年
2025-2026 年 Qt 6.9 ~ 6.11 重点增强: • 硬件加速 2D 渲染 • 3D 图形改进(SSGI 等) • 可访问性(Accessibility) • QML 性能与现代 C++ 异步支持 • Android 16 等平台更新
 
 

Qt 主要版本特点总结

  • Qt 4:经典时代,Widgets 体系最成熟,被大量传统桌面软件采用。
  • Qt 5:引入 QML,让 Qt 进入现代 UI 时代,极大提升了动画和美观度。
  • Qt 6(当前主流):架构更干净、性能更高、模块更清晰,全面拥抱现代 C++,为未来 10 年打下基础。

当前发展趋势(2026 年)

  1. Qt Quick(QML) 越来越为主流,即使是桌面软件也倾向于混合使用。
  2. 重点投入 汽车、工业嵌入式、医疗 等高可靠性领域。
  3. 加强 性能、图形渲染、可访问性
  4. CMake 已成为官方推荐构建系统(qmake 逐渐淡化)。
  5. 商业许可政策更严格,但开源版仍可用于很多项目。

Qt库版本的兼容性

Qt 的版本兼容性是所有长期维护项目(尤其是工业控制、上位机、自动化系统等对稳定性要求极高的领域)必须面对的核心问题。

Qt 的版本号严格遵循语义化版本(Semantic Versioning),即 主版本号.次版本号.修订版本号(例如 6.5.12)。它们之间的兼容性规律非常清晰,主要分为以下三个维度:

一、 兼容性的三大核心定律

1. 修订版本之间(Patch Releases, 如 6.5.1 $\rightarrow$ 6.5.12)

  • 兼容性100% 源码兼容 + 100% 二进制兼容

  • 原则:这个级别的更新只修复 Bug、优化性能和修补安全漏洞,绝对不会增加新功能或改变既有 API。

  • 开发策略:上位机系统在生产环境中更新补丁版本通常是绝对安全的,不需要重新编译既有程序,直接替换动态链接库(.dll 或 .so)即可运行。

2. 次版本之间(Minor Releases, 如 6.2 $\rightarrow$ 6.5 <span class="math-inline" data-math="\rightarrow" data-index-in-node="47">$\rightarrow$ 6.8)

  • 兼容性向后二进制兼容(Backward Binary Compatibility)+ 绝大多数源码兼容

  • 原则:允许引入新功能、新模块,允许将旧 API 标记为废弃(Deprecated),但不能删除旧 API

  • 向后二进制兼容的意思是:用低版本(如 Qt 6.2)编译好的程序,可以直接在高版本(如 Qt 6.5)的运行库下跑;但反过来不行。

  • 开发策略:如果项目从 Qt 6.2 升级到 Qt 6.5,直接重新编译代码(Source code)通常能一次性直接通过,只有极少数使用了未公开 API 或底层非稳定特性的地方可能需要微调。

3. 主版本之间(Major Releases, 如 Qt 4 $\rightarrow$ Qt 5 <span class="math-inline" data-math="\rightarrow" data-index-in-node="49">$\rightarrow$ Qt 6)

  • 兼容性完全不承诺二进制兼容,源码部分兼容(需要移植)

  • 原则:主版本号的升级意味着底层架构的彻底重构和“卸下历史包袱”。不合时宜的旧 API 会被彻底删除,模块会被分拆或合并。

  • 开发策略不能直接替换库,也不能直接无脑重编译。 必须根据官方移植指南(Porting Guide)修改代码。

二、 焦点:Qt 5 与 Qt 6 之间的断层与过渡

如果你手里有基于 Qt 5(比如非常经典的工业级版本 Qt 5.9 或 Qt 5.15)开发的上位机系统,想要迁移到 Qt 6,会遇到以下几个关键的兼容性变化:

1. 编译标准的大修

  • Qt 5:基于 C++11 标准。

  • Qt 6:强制要求 C++17 或更高版本的编译器(如 MSVC 2022、MinGW 13.1)。如果你的老项目中包含大量古老的 C 风格代码或不兼容 C++17 语法的第三方库,编译会报错。

2. 被彻底移除或重构的核心类

Qt 6 砍掉了很多历史包袱,导致大量老代码在初次编译时会“满屏飘红”:

  • QRegExp(正则表达式)被移除:完全被 QRegularExpression 取代。

  • QTextCodec(编码转换)被移除:内核默认全平面转为 QStringDecoder/QStringEncoder(默认 UTF-8),这对于处理工业串口/网口底层 GBK 字符集的上位机影响极大。

  • 图形渲染架构剧变:Qt 5 强依赖 OpenGL,而 Qt 6 引入了全新的 RHI(Rendering Hardware Interface) 抽象层,底层支持 Vulkan、DirectX 12、Metal 和 OpenGL。老项目中直接调用底层 OpenGL 函数(如 QOpenGLWidget)的代码必须重写。

3. 官方救火队:Core5Compat 模块

为了防止老项目迁移工作量过大,官方在 Qt 6 中提供了一个过渡模块 Core5Compat

如果在 CMake 中引入:

 CMake

 
find_package(Qt6 REQUIRED COMPONENTS Core5Compat)
target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)

你就能在 Qt 6 中继续复用 QRegExpQTextCodec 等已被删除的 Qt 5 遗留类,以此来实现平滑降落,后续再逐步重构。

三、 现代 CMake 下的“双版本跨越”技巧

在实际工程中,为了保证维护的灵活性,很多团队会编写一套代码,同时兼容 Qt 5 和 Qt 6。从 Qt 5.15 开始,官方引入了无版本号目标(Versionless Targets)机制,使得编写跨版本构建脚本变得极其简单:

CMake
 
# 优先寻找 Qt 6,找不到则回退到 Qt 5.15
find_package(Qt6 COMPONENTS Core Widgets)
if (NOT Qt6_FOUND)
    find_package(Qt5 5.15 REQUIRED COMPONENTS Core Widgets)
endif()

add_executable(HyMasterProject main.cpp)

# 使用通用的 Qt::Core 和 Qt::Widgets,CMake 会自动解析为对应的 Qt5:: 或 Qt6::
target_link_libraries(HyMasterProject PRIVATE 
    Qt::Core 
    Qt::Widgets
)

🛠️ 工业/商业项目的版本选择与兼容性建议

  1. 拒绝尝鲜非 LTS 版本:在商业和工业自动化生产中,只选用 LTS(Long-Term Support,长期支持)版本。Qt 6 时代的 6.2 LTS6.5 LTS 以及目前的 6.8 LTS 才是主力。LTS 版本拥有长达 5 年的补丁维护期,能最大程度规避次版本更新带来的行为断层。

  2. 善用 QT_DISABLE_DEPRECATED_UP_TO:如果你还在用 Qt 5.15 维护老项目,可以在工程中定义这个宏(将其设置为 0x060000)。编译器会把所有在 Qt 6 中即将被删除的旧 API 直接报错剔除,逼迫你在代码阶段就完成准 Qt 6 化的合规重构。

 

posted on 2026-06-02 10:41  淡若轻风  阅读(348)  评论(0)    收藏  举报