乐于分享
好东西不私藏

改 Qt 源码踩坑实录:override 报错背后,是 Qt 与 C++ 版本的 “相爱相杀”

本文最后更新于2026-01-01,某些文章具有时效性,若有错误或已失效,请在下方留言或联系老夜

改 Qt 源码踩坑实录:override 报错背后,是 Qt 与 C++ 版本的 “相爱相杀”



——————————

改 Qt 源码踩坑实录:override 报错背后,是 Qt 与 C++ 版本的 “相爱相杀”

1 问题的提出

在修改Qt源码时,提示报错:

ounter(lineounter(lineounter(line/home/ub-1001/work/myd-as62x/oe-layersetup/build/arago-tmp-default-glibc/work/aarch64-oe-linux/qtbase/5.15.7+gitAUTOINC+358aebba72-r0.arago17/git/src/plugins/platforms/linuxfb/qlinuxfbintegration.h:78:30: error: 'QList<QPlatformScreen*> QLinuxFbIntegration::screens() const' marked 'override', but does not override|    78 |     QList<QPlatformScreen *> screens() const override;|       |                              ^~~~~~~

编译的qt版本是qt5.15,它对 C++ 标准的支持采用 “基础兼容 + 可选扩展” 的策略,其核心实现基于 C++11,同时对更高版本的 C++ 标准(C++14、C++17)提供部分支持

override 关键字用于确保派生类正确地重写基类的虚函数。它是 C++11引入的一个继承控制关键字,主要用于防止重写错误,当派生类在声明虚函数时使用 override 描述符时,该函数必须重载其基类中的同名函数,否则代码将无法通过编译。上面的错误在于说明,子类QLinuxFbIntegration::screens()想重写screens方法,但父类没有对应的方法,override编译时提示错误,可参见示例

时移世易、世易时移,虽然掌握老版本,对于新版本可以容易上手,但不了解新版本的新特性,对于可靠开发,还是很远。所有必要整理下Qt与C++的版本更新,找到差距,跟上变化。

2 Qt版本演进

Qt 作为跨平台应用开发框架,其版本迭代中出现了多个具有里程碑意义的版本,这些版本不仅推动了框架本身的进化,也深刻影响了跨平台开发的生态。以下是几个最具代表性的重要版本:

1. Qt 4.0(2005 年)

  • 核心意义:奠定现代 Qt 框架的基础架构,是 Qt 从早期实验性工具向成熟商业框架转型的标志。
  • 关键特性:
    • 首次将框架拆分为模块化结构(如 QtCoreQtGuiQtNetwork 等),降低了模块间耦合,提升了灵活性。
    • 改进信号槽(Signal & Slot)机制,引入元对象系统(Meta-Object System)的成熟实现,成为 Qt 最核心的特色之一。
    • 扩展跨平台支持,全面覆盖 Windows、Linux、macOS 等桌面平台,同时开始探索移动设备(如 Symbian)。
    • 引入 Qt Designer 可视化界面设计工具,大幅降低 GUI 开发门槛。

2. Qt 4.8(2011 年)

  • 核心意义:Qt 4 系列的最后一个长期支持(LTS)版本,稳定性和兼容性极佳,至今仍被大量 legacy 项目依赖。
  • 关键特性:
    • 优化了对嵌入式系统和移动平台(如 Maemo、MeeGo)的支持,成为当时嵌入式开发的主流框架之一。
    • 完善了图形渲染性能,修复了大量 Qt 4 早期版本的漏洞,稳定性达到顶峰。
    • 虽然基于 C++98/03 标准,但通过内部封装提供了部分 “准现代” 特性(如简化的容器类操作)。
  • 现状:由于历史项目的惯性,部分工业软件、嵌入式设备仍在使用 Qt 4.8,但其官方支持已终止(2020 年结束)。

3. Qt 5.0(2012 年)

  • 核心意义:Qt 历史上最具颠覆性的更新之一,彻底重构了框架底层,扩展了应用场景(从桌面到移动、嵌入式、甚至 Web)。
  • 关键特性:
    • 引入 QML 和 Qt Quick:一种声明式语言 + 运行时引擎,专门用于快速开发动态界面(尤其适合移动应用和触控设备),与传统 C++ 开发模式形成互补。
    • 模块化架构升级:将核心模块进一步拆分(如 QtWidgets 独立于 QtGui),新增 QtWebKit(网页集成)、QtMultimedia(多媒体)等模块。
    • 全面支持 C++11:允许开发者使用 auto、lambda、智能指针等现代 C++ 特性,提升代码效率。
    • 图形后端升级:采用 OpenGL ES 作为默认渲染引擎,优化跨平台图形一致性,为移动设备适配奠定基础。

4. Qt 5.15(2020 年)

  • 核心意义:Qt 5 系列的最后一个 LTS 版本,也是 Qt 从 “诺基亚时代” 转向 “The Qt Company 时代” 后的集大成者。
  • 关键特性:
    • 整合了 Qt 5 系列的所有迭代优化(如 Qt 5.12 引入的 Qt 3D、Qt 5.14 改进的 QML 性能)。
    • 强化了对现代平台的支持:全面适配 Windows 10、macOS Catalina、iOS 13、Android 10 等。
    • 提供对 C++17 的部分支持(需手动开启编译选项),为后续升级到 Qt 6 铺路。
    • 官方提供长期支持(至 2025 年),成为许多企业级项目的 “稳定之选”。

5. Qt 6.0(2020 年)

  • 核心意义:Qt 进入 “现代架构” 的标志,聚焦性能、模块化和对未来技术的适配。
  • 关键特性:
    • 以 C++17 为基础标准,全面利用现代 C++ 特性(如 constexpr、结构化绑定)优化框架底层。
    • 重构图形架构:引入 Qt Rendering Hardware Interface (RHI),统一 OpenGL、Vulkan、Direct3D 等图形 API 的抽象层,提升跨平台渲染效率。
    • 强化 Qt Quick 3D:原生支持 3D 渲染,无需依赖第三方库,简化 3D 界面开发。
    • 模块化进一步精简:移除过时模块(如 Qt WebKit 替换为 Qt WebEngine),核心模块更轻量。
  • 后续演进:Qt 6 系列持续迭代(如 6.2 引入 Qt Design Studio,6.5 强化对嵌入式 Linux 的支持),成为当前 Qt 开发的主流选择。

3 C++版本演进

C++ 自诞生以来经历了多次标准化迭代,每一个版本都在解决历史问题、提升开发效率、适应新的编程需求。以下是主要版本的时间、特点及作用:

1. C++98(1998 年)

  • 时间:1998 年由 ISO/IEC 发布,是 C++ 的第一个国际标准(ISO/IEC 14882:1998)。
  • 特点:
    • 确立了 C++ 的核心语法框架,包括类(class)、继承、多态、模板(泛型编程基础)、异常处理、命名空间(namespace)等。
    • 基于 C 语言扩展,兼容大部分 C 语法,同时引入面向对象编程(OOP)特性。
  • 作用:首次统一了 C++ 的语法标准,结束了早期编译器实现不一致的问题,为 C++ 的普及奠定了基础。

2. C++03(2003 年)

  • 时间:2003 年发布(ISO/IEC 14882:2003),是对 C++98 的修订版。
  • 特点:
    • 没有新增核心特性,主要是修复 C++98 中的漏洞(如标准库细节、语法歧义等),优化标准库实现。
  • 作用:提升了标准的严谨性和编译器实现的一致性,确保 C++98 的功能更可靠。

3. C++11(2011 年)

  • 时间:2011 年发布(ISO/IEC 14882:2011),原名 “C++0x”(因计划 2010 年前发布),是 C++ 历史上最重大的更新之一。
  • 特点:
    • 引入大量现代编程特性:auto(自动类型推导)、decltype(类型查询)、lambda 表达式(匿名函数)、右值引用(&&,支持移动语义和完美转发)、智能指针(unique_ptr/shared_ptr,解决内存管理问题)。
    • 增强泛型编程:constexpr(编译期常量计算)、template alias(模板别名)、可变参数模板(variadic templates)。
    • 其他:范围 for 循环(for (auto x : container))、nullptr(替代NULL,避免歧义)、enum class(强类型枚举)等。
  • 作用:大幅提升开发效率,解决了 C++98 中内存泄漏、代码冗余、泛型编程繁琐等问题,让 C++ 更适应现代软件开发需求(如高性能、高可读性)。

4. C++14(2014 年)

  • 时间:2014 年发布(ISO/IEC 14882:2014),是 C++11 的增量更新。
  • 特点:
    • 完善 C++11 的特性:泛型 lambda(lambda 参数支持auto)、函数返回类型自动推导(auto func() { return 1; })、constexpr函数支持更多操作(如循环、分支)。
    • 新增实用功能:std::make_unique(简化智能指针创建)、二进制字面量(0b1010)、数字分隔符(1'000'000)等。
  • 作用:降低 C++11 特性的使用门槛,进一步提升代码简洁性和开发效率。

5. C++17(2017 年)

  • 时间:2017 年发布(ISO/IEC 14882:2017)。
  • 特点:
    • 结构化绑定(auto [a, b] = pair;,简化复合类型的解构)。
    • 编译期条件判断(if constexpr,减少运行时分支)。
    • 并行算法(标准库算法支持多线程,如std::for_each_par)。
    • 折叠表达式(fold expressions,简化可变参数模板的展开)。
    • 其他:std::string_view(高效字符串视图,避免复制)、inline变量等。
  • 作用:强化编译期计算能力,优化对多核处理器的支持,提升大型项目的性能和可维护性。

6. C++20(2020 年)

  • 时间:2020 年发布(ISO/IEC 14882:2020),又一次重大更新。
  • 特点:
    • 概念(Concepts,约束模板参数,替代繁琐的enable_if,提升编译错误可读性)。
    • 模块(Modules,替代#include,解决头文件重复包含、编译慢的问题)。
    • 协程(Coroutines,支持异步编程,简化状态机逻辑)。
    • 范围库(Ranges,提供更灵活的序列操作,如view::filter/view::transform)。
    • 其他:consteval(强制编译期执行)、三路比较运算符(<=>)等。
  • 作用:解决 C++ 长期存在的痛点(如头文件依赖、模板错误难调试),原生支持现代编程范式(异步、函数式),为大型项目提供更好的模块化和可扩展性。

7. C++23(2023 年)

  • 时间:2023 年发布,是对 C++20 的完善。
  • 特点:
    • 扩展范围 for 循环(支持初始化器,如for (auto x : get_container()) { ... })。
    • 改进协程(简化返回类型,如task<int>)。
    • 新增标准库功能:std::print(原生打印函数,替代printf/cout)、std::expected(错误处理机制)。
    • 完善概念和模块的细节。
  • 作用:进一步降低 C++20 新特性的使用复杂度,填补标准库功能空白(如原生打印),提升语言的易用性。

—————————–



点击阅读全文,感谢分享、收藏、点赞、在看



本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 改 Qt 源码踩坑实录:override 报错背后,是 Qt 与 C++ 版本的 “相爱相杀”
×
订阅图标按钮