Qt6 强制要求使用 C++17 标准编译,迁移 Qt5 项目时必须将构建系统配置为 C++17 并处理 std::filesystem 与 QString 的类型转换。适用场景为 Qt5 升级至 Qt6 且希望使用现代 C++ 特性的项目,风险边界在于旧编译器不支持 C++17 或路径编码转换错误。
先说结论:Qt6 移除了对 C++11 和 C++14 的支持,项目迁移必须启用 C++17 标准,但无需强制替换所有 QFile 为 std::filesystem。
- 先确认:检查编译器版本是否支持 C++17 特性
- 先处理:在 CMake 或 qmake 中显式开启 C++17 标准
- 再验证:编译通过后验证路径转换逻辑在目标系统生效
快速处理思路
构建配置修改是迁移的第一步,直接在构建文件中指定标准版本即可。
# CMakeLists.txt
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# .pro (qmake)
CONFIG += c++17为什么会这样
Qt6 架构升级强制提升了最低 C++ 标准要求。
Qt5 后期版本虽支持 C++17,但默认兼容 C++11。Qt6 为了利用新特性优化内部实现,移除了旧标准支持。std::filesystem 是 C++17 标准库的一部分,不再需要单独链接 boost 或实验性库,但需注意编译器实现差异。
分步处理
按顺序修改构建配置、头文件包含和路径转换逻辑。
1. 修改构建文件:在 CMakeLists.txt 中添加 CMAKE_CXX_STANDARD 17,或在 .pro 文件中添加 CONFIG += c++17。
2. 引入头文件:在使用文件系统的源文件中添加 #include <filesystem>。
3. 处理路径转换:使用 QString::toStdString() 转换为 std::filesystem::path,使用 QString::fromStdString() 转回。
4. 链接处理:GCC 8 以下版本可能需要手动链接 stdc++fs,GCC 9+ 和 Clang 通常内置支持。
怎么验证是否生效
编译无报错且运行时路径解析正确即表示适配成功。
检查构建日志确认没有 C++11/14 相关警告。在代码中打印 std::filesystem::current_path() 结果,确认与 QDir::currentPath() 一致。在 Windows 上验证反斜杠路径是否被正确识别。
常见坑
路径编码和分隔符是主要出错点,需特别注意跨平台差异。
- Windows 路径分隔符:std::filesystem 支持正斜杠,但混合使用时需统一
- 编码问题:QString 默认 Unicode,std::string 可能为 ANSI,转换时需确保 UTF-8
- 编译器版本:旧版 MinGW 可能缺少完整的 filesystem 实现
常见问题
Qt6 项目必须使用 std::filesystem 吗?
不是必须,Qt6 仍保留 QDir 和 QFile 类。
你可以继续使用 Qt 的文件类,它们内部已适配 C++17 标准。仅在需要与纯 C++ 库交互时建议引入 std::filesystem。
QString 和 std::filesystem::path 如何互转?
通过 std::string 作为中间层进行转换。
使用 path(QString::toStdString()) 创建路径对象,使用 QString::fromStdString(path.string()) 获取字符串。
参考来源
- Qt Documentation, Supported Platforms and Configurations, https://doc.qt.io/qt-6/supported-platforms-and-configurations.html