台北市网站建设_网站建设公司_小程序网站_seo优化
2026/1/9 17:42:05 网站建设 项目流程

Qt 6.8+ 架构下特定字符编码(GBK/GB18030)全景支持方案研究报告

1. 绪论:后 Unicode 时代的遗留编码挑战

在现代软件工程的演进历程中,字符编码的处理始终是一个兼具技术深度与文化广度的核心议题。随着 Unicode 标准(特别是 UTF-8 和 UTF-16)在全球范围内的统治地位确立,主流开发框架纷纷调整其底层架构,以 Unicode 为绝对核心进行重构。Qt 框架,作为跨平台应用开发的标杆,自 Qt 6.0 版本起,实施了一场激进的文本处理架构变革,旨在通过强制性的 UTF-8/16 统一化来提升性能并简化 API 设计。

然而,这种架构性的“净化”在特定区域市场——尤其是中文软件生态中——遭遇了复杂的现实挑战。GBK(汉字内码扩展规范)及其后续标准 GB18030-2022,不仅是中国国家强制标准,更是金融、电信、政府存量系统中不可撼动的数据基石。对于使用 Qt 6.8 及更高版本的架构师与开发者而言,如何在摒弃了 QTextCodec 这一传统瑞士军刀式工具的核心库中,优雅、高效且合规地实现对 GBK/GB18030 的支持,成为了一个必须解决的系统工程问题。

本报告旨在为 Qt 6.8+ 环境下的 GBK/GB18030 编码支持提供一份详尽的、专家级的解决方案图谱。我们将深入解构 Qt 6 的文本处理管线,剖析 ICU(International Components for Unicode)库在其中的关键角色,对比 Qt5Compat 模块与原生 QStringConverter 方案的优劣,并针对 Windows 平台的特殊性提出具体的工程化建议。此外,报告还将延伸至文本排序(Collation)、字体渲染(Font Rendering)以及网络流处理等高级议题,以确保涵盖企业级应用开发的全生命周期需求。

2. 编码架构演进:从 Qt 5 到 Qt 6.8 的范式转移

要理解 Qt 6.8 中处理 GBK 的机制,首先必须深刻理解 Qt 文本架构的代际差异。这不仅是 API 的更替,更是设计哲学的根本转向。

2.1 Qt 5 时代的 QTextCodec 机制

在 Qt 5 时代,QTextCodec 是文本编码处理的绝对枢纽。它作为一个单例管理的工厂类,维护着庞大的编码转换表。无论是文件读取、网络流解析,还是简单的字符串拼接,QTextCodec 都扮演着隐形转换器的角色。

开发者的典型用法极其依赖于全局状态:

  • QTextCodec::setCodecForLocale():设置系统本地编码。
  • QTextCodec::codecForName(“GBK”):动态获取转换器实例。

这种设计的优势在于“开箱即用”。Qt 5 的核心库(QtCore)内置了大量遗留编码的转换表,导致开发者往往无需关心底层实现即可在 Windows(默认 GBK 环境)上正确读写中文文件。然而,这种便利是有代价的:

  1. 二进制膨胀:所有应用,无论是否需要,都背负着巨大的转换表。
  2. 隐式转换陷阱:QString 与 const char * 之间的隐式构造经常调用默认 Codec,导致跨平台部署时(如从 Windows 到 Linux)出现“乱码”(Mojibake)现象。
  3. 维护成本:随着 Unicode 的普及,维护一套独立于 ICU 之外的私有转换逻辑变得不再经济。

2.2 Qt 6 的 Unicode 优先策略与 QStringConverter

Qt 6 引入了 QStringConverter 及其子类 QStringEncoder 和 QStringDecoder,作为现代化的替代方案。这一变革基于以下核心公理:

  • UTF-8 Everywhere:Qt 6 假定所有 8 位字符串(char*, QByteArray)默认均为 UTF-8 编码,除非明确指定。
  • 无状态与有状态的分离:QStringConverter 明确区分了无状态转换与有状态解码(Streaming Decoding),以解决多字节字符在缓冲区边界被截断的问题。
  • 后端解耦:这是影响 GBK 支持的关键点。Qt 6 将具体的编码实现剥离,仅在核心库中保留 UTF-8, UTF-16, UTF-32 和 ISO-8859-1 (Latin-1) 的支持。所有其他编码(包括 GBK, Big5, Shift-JIS)的支持,被委托给了 ICU 库

2.3 Qt 6.8 的关键特性与版本现状

截至 Qt 6.8 LTS,这一架构已趋于成熟,但也暴露了平台差异性问题。

  • API 增强:Qt 6.8 对 QStringDecoder 的构造函数进行了增强,支持 QAnyStringView,使得字符串字面量的传递更加高效。
  • ICU 依赖性:在 Linux 和 macOS 上,Qt 默认链接系统 ICU 库,因此 QStringDecoder(“GBK”) 通常能直接工作。但在 Windows 平台上,官方提供的预编译二进制包(尤其是 MSVC 版本)为了减少依赖地狱(Dependency Hell)和安装包体积,默认禁用了 ICU 支持

这意味着,一个在 Linux 上完美运行的读取 GBK 文件的 Qt 6.8 程序,直接拿到 Windows 上编译运行,极有可能会因为 QStringDecoder 返回无效对象而导致功能失效。这是当前企业级迁移中最大的痛点之一。

3. 核心方案一:原生现代化路径(基于 ICU)

对于追求长期架构演进、性能优化及代码纯净度的项目,采用 Qt 6 原生的 QStringConverter 配合 ICU 后端是首选方案。此方案完全摒弃了 QTextCodec,符合 Qt 7 及未来的演进方向。

3.1 方案原理

该方案依赖于 Qt 6 Core 模块对 ICU 库的动态加载或静态链接。当开发者调用 QStringDecoder(“GBK”) 时,Qt 内部会执行以下逻辑:

  1. 检查请求的编码名称是否为内置(UTF/Latin1)。如果不是:
  2. 检查 Qt 构建时是否启用了 ICU 支持 (QT_CONFIG(icu))。
  3. 如果启用,调用 ICU 的 ucnv_open 接口加载 “GBK” 或 “GB18030” 转换器。
  4. 如果加载成功,返回有效的 QStringDecoder 对象;否则置为无效状态。

3.2 实施步骤:解决 Windows 平台的 ICU 缺失

鉴于 Windows 官方预编译包通常缺失 ICU 支持,实施此方案通常需要以下两种途径之一:

3.2.1 途径 A:自定义编译 Qt 6.8(推荐用于深度定制)

这是最彻底的解决方案。通过从源码编译 Qt,显式开启 ICU 支持,可以确保生成的 DLL 原生具备 GBK 处理能力。

构建环境准备

  • 编译器:MSVC 2022 或 MinGW-w64。
  • 依赖库:下载并编译 ICU 库(通常包括 icudt.lib, icuuc.lib, icuin.lib)。
  • 构建工具:CMake 3.21+, Ninja, Python 3。

配置命令示例(Windows/CMake)

configure.bat ^ -prefix "C:\Qt\6.8.0\MyBuild_ICU" ^ -icu ^ -I "C:\ThirdParty\icu\include" ^ -L "C:\ThirdParty\icu\lib" ^ -debug-and-release ^ -nomake examples ^ -nomake tests

注:-icu 参数是关键,它强制 Qt Core 链接 ICU 库。如果 ICU 未找到,配置脚本将报错而非静默回退。

部署影响:
自定义编译后的应用发布时,必须携带 ICU 的动态链接库(icudtXX.dll, icuucXX.dll, icuinXX.dll),这会增加约 20MB-30MB 的安装包体积(取决于是否裁剪了 ICU 数据包)。

3.2.2 途径 B:等待 Qt 6.10 的系统 ICU 集成(前瞻性策略)

根据 Qt 官方的 roadmap 和 bug tracker(如 QTBUG-132056),Qt 团队计划在未来的版本(预计 Qt 6.10)中,在 Windows 平台上默认使用 Windows SDK 提供的 ICU 实现(Windows.Globalization)。这将是一个里程碑式的改进,意味着开发者无需自己编译 ICU,即可直接调用系统内置的 GBK 解码能力。

对于处于 Qt 6.8 周期但项目周期较长的团队,可以暂时使用方案二(Qt5Compat)作为过渡,并计划在 Qt 6.10 发布后切换回原生 API。

3.3 代码实现范式

使用 QStringConverter 进行 GBK 解码的标准代码模式如下。此模式展示了如何处理文件流和错误检测。

表 3-1:QStringConverter 关键标志位解析

标志位 (Flag)描述在 GBK 场景下的应用
Flag::Stateless忽略上下文状态,每次调用视为独立数据块。不推荐用于文件读取。GBK 双字节字符若在 Buffer 边界被切断,无状态解码会导致乱码或替换符。
Flag::ConvertInvalidToNull将无效序列转换为 \0。用于严格的数据校验场景。
Flag::Default默认行为,使用替换字符(QChar::ReplacementCharacter, U+FFFD)处理无效序列。推荐用于一般日志读取或文本显示,容错性好。

代码示例:健壮的 GBK 文件读取器

#include<QStringDecoder>#include<QFile>#include<QDebug>QStringreadGbkFile(constQString&filePath){QFilefile(filePath);if(!file.open(QIODevice::ReadOnly)){qWarning()<<"无法打开文件:"<<filePath;returnQString();}// 构造解码器。注意:如果 Qt 构建时无 ICU 且非 UTF 编码,isValid() 将返回 falseQStringDecoderdecoder("GBK",QStringDecoder::Flag::Default);if(!decoder.isValid()){qCritical()<<"错误:当前 Qt 环境不支持 GBK 编码,请检查是否启用了 ICU 或 Core5Compat。";returnQString();}QString result;// 预分配内存策略:假设 GBK 也是双字节,与 UTF-16 比例接近 1:1,避免频繁 reallocresult.reserve(file.size());// 分块读取,模拟流式处理constqint64 bufferSize=4096;while(!file.atEnd()){QByteArray chunk=file.read(bufferSize);// decoder 对象内部维护状态,自动处理跨块的半个汉字result.append(decoder(chunk));}returnresult;}

4. 核心方案二:兼容性桥梁(Qt5Compat 模块)

对于大多数无法自行编译 Qt 源码,且必须立即在 Windows 官方版本上支持 GBK 的商业项目,Qt5Compat 模块提供了最务实、成本最低的解决方案。

4.1 模块定位与机制

Qt5Compat(全称 Qt 5 Core Compatibility APIs)是 Qt 6 为了平滑迁移而提供的独立模块。它不仅包含了被移除的 QTextCodec,还包含了 QRegExp(被 QRegularExpression 取代)等旧类。

核心优势:
该模块内部内置了一套完整的遗留编码转换表(包括 GBK, Big5, Shift-JIS 等),完全不依赖系统的 ICU 库。这意味着,只要链接了这个模块,无论是在裁剪版的 Linux 还是默认的 Windows MSVC 环境下,QTextCodec::codecForName(“GBK”) 都能 100% 稳定工作。

4.2 构建系统配置

要使用此方案,必须在构建系统中显式声明对 Core5Compat 的依赖。

CMake 配置 (CMakeLists.txt)

cmake_minimum_required(VERSION 3.16) project(GbkApp LANGUAGES CXX) find_package(Qt6 REQUIRED COMPONENTS Core Core5Compat) add_executable(GbkApp main.cpp) target_link_libraries(GbkApp PRIVATE Qt6::Core Qt6::Core5Compat )

qmake 配置 (.pro)

QT += core core5compat

4.3 代码实现与迁移

虽然使用了旧 API,但建议进行适当的封装,以便未来移除该模块。

// 引入头文件,注意 Qt 6 下的路径变化#include<QtCore5Compat/QTextCodec>#include<QByteArray>QStringdecodeGbkWithCompat(constQByteArray&data){// 获取 GBK 解码器// 注意:在 Qt 6 中,codecForName 返回的指针由 Qt 管理,无需手动释放QTextCodec*codec=QTextCodec::codecForName("GBK");if(!codec){// 理论上只要连接了 Core5Compat,这里不会失败returnQString::fromUtf8(data);// 回退策略}returncodec->toUnicode(data);}QByteArrayencodeGbkWithCompat(constQString&str){QTextCodec*codec=QTextCodec::codecForName("GBK");if(!codec)returnstr.toUtf8();returncodec->fromUnicode(str);}

4.4 方案权衡

优势

  1. 零外部依赖:无需安装 ICU,无需重编译 Qt。
  2. 行为一致性:与 Qt 5 行为完全一致,由于使用的是同一套代码库,对于从 Qt 5 移植的老代码,回归风险最小。

劣势

  1. 技术债务:QTextCodec 已被标记为过时,未来 Qt 7 可能会彻底移除该模块。
  2. 二进制开销:Qt6Core5Compat.dll 文件本身有一定体积。
  3. 性能:QTextCodec 的实现通常比经过高度优化的 ICU 或系统 API 略慢(尽管在普通 I/O 瓶颈下可忽略)。

5. 进阶场景:GBK 生态下的全链路支持

仅仅实现字符串转换是远远不够的。在真实的业务场景中,GBK 编码往往贯穿于文件、网络、数据库和 UI 显示的全过程。以下针对这些特定场景进行深入分析。

5.1 文件 I/O 与 QTextStream 的断层

在 Qt 5 中,开发者习惯使用 QTextStream::setCodec(“GBK”) 来读写文本文件。但在 Qt 6 中,QTextStream 的 API 发生了重大变化。它不再接受字符串形式的 Codec 名称,也不再接受 QTextCodec 指针,而是仅接受 QStringConverter::Encoding 枚举。

问题:由于 QStringConverter::Encoding 枚举中没有 GBK,直接使用 QTextStream 处理 GBK 文件在原生 Qt 6 中变得非常困难(除非使用 System 且系统刚好是中文)。

解决方案:
必须放弃直接用 QTextStream 读取文件,改用“二进制读取 + 手动解码”模式。
错误示范(Qt 6 中无法编译或运行)

QFilef("data.txt");f.open(QIODevice::ReadOnly);QTextStreamts(&f);ts.setCodec("GBK");// 编译错误:setCodec 不存在或参数不匹配

正确示范(桥接模式)

QFilef("data.txt");if(f.open(QIODevice::ReadOnly)){// 1. 读取原始字节QByteArray raw=f.readAll();// 2. 解码 (使用 Core5Compat 或 ICU Decoder)QString content=decodeGbkWithCompat(raw);// 3. 如果需要按行处理,再使用 QTextStream 处理内存中的 QStringQTextStreamts(&content);while(!ts.atEnd()){QString line=ts.readLine();process(line);}}

5.2 网络数据流 (QNetworkReply) 处理

在处理 HTTP 请求时,许多中文老旧网站或 API 仍返回 Content-Type: text/html; charset=gbk。

QNetworkReply 本身不执行字符集转换,它只提供原始的 QByteArray。开发者必须解析 Header 并手动解码。

代码策略

voidhandleNetworkReply(QNetworkReply*reply){QByteArray data=reply->readAll();// 获取 Content-Type 头QVariant header=reply->header(QNetworkRequest::ContentTypeHeader);QString contentType=header.toString();QString result;if(contentType.contains("gbk",Qt::CaseInsensitive)||contentType.contains("gb2312",Qt::CaseInsensitive)){// 检测到 GBK,调用解码器QStringDecoderdecoder("GB18030");// GB18030 兼容 GBK 且字符集更全result=decoder(data);}else{// 默认 UTF-8result=QString::fromUtf8(data);}// 处理结果...}

注意:推荐使用 GB18030 代替 GBK,因为 GB18030 是 GBK 的超集,能够处理更多生僻字,且完全向下兼容。

5.3 数据库连接

Qt 的 SQL 模块(QSqlDatabase)通常依赖于数据库驱动程序来处理编码。对于 MySQL、PostgreSQL 等现代数据库,驱动程序会自动处理编码协商,Qt 层通常只需处理 UTF-16 的 QString。

但在连接遗留的、配置为 GBK 字符集的数据库(如老版本 Oracle 或 SQL Server)时,必须确保 ODBC 数据源或连接字符串中指定了正确的字符集配置。例如,在 ODBC 连接串中添加 CHARSET=GBK,确保驱动程序在将数据传给 Qt 之前,能正确地将 GBK 转换为 UTF-16(Windows ODBC 驱动通常通过 Wide API 交互,自动完成此步骤)。

5.4 字体渲染与 DirectWrite (Qt 6.7+)

GBK 文本被正确解码为 QString 后,还需要正确的字体支持才能显示。Qt 6.7 及 6.8 在 Windows 上将默认字体引擎从 GDI 切换为了DirectWrite

影响:
DirectWrite 对字体回退(Font Fallback)的处理比 GDI 更加智能,但也更加严格。如果系统首选字体(如 Segoe UI)不包含某些 GBK 特有字符(如生僻汉字),DirectWrite 需要去查找 fallback 字体(如 Microsoft YaHei UI 或 SimSun)。
新特性应用:
Qt 6.8 引入了 font.contextFontMerging 属性。
对于混合排版(如中文与少数民族文字,或极其生僻的 GB18030 汉字),开启此属性可以指示 Qt 使用更昂贵但更精确的算法来合并不同字体的字形,防止出现“豆腐块”(.notdef glyph)。

// QML 示例 Text { text: "一些包含生僻字的GBK文本..." font.family: "Microsoft YaHei" font.contextFontMerging: true // Qt 6.8+ 新特性,增强复杂字符显示 }

6. 深度专题:中文排序 (Collation) 的挑战

在显示文件名列表或通讯录时,用户期望的排序往往不是 Unicode 码点顺序,而是拼音顺序或笔画顺序。

6.1 QCollator 的后端依赖

QCollator 是 Qt 6 处理本地化排序的核心类。与 QStringConverter 类似,它的能力高度依赖后端。

  • Linux/macOS (ICU): ICU 提供了极其强大的排序定制能力,支持 zh_CN (拼音) 和 zh_TW (笔画) 等标准,甚至支持通过 keywords 定制(如 zh-u-co-stroke 强制简体中文按笔画排序)。
  • Windows (System API): 如果没有链接 ICU,Qt 6.8 在 Windows 上会回退到调用 Win32 API (CompareStringEx)。Windows 的 zh-CN Locale 默认即为拼音排序。

6.2 拼音排序实现

#include<QCollator>#include<QLocale>voidsortStrings(QStringList&list){// 显式指定简体中文 LocaleQLocalecnLocale(QLocale::Chinese,QLocale::China);QCollatorcollator(cnLocale);collator.setNumericMode(true);// 智能处理数字,如 "文件2" < "文件10"collator.setCaseSensitivity(Qt::CaseInsensitive);// 使用 std::sort 配合 QCollatorstd::sort(list.begin(),list.end(),collator);}

潜在坑点:
如果用户的 Windows 系统 Locale 被设置为了非中文(如英文),且 Qt 没有使用 ICU,构建 QLocale::Chinese 的 QCollator 可能会失效或回退到 Unicode 排序。在严格要求排序一致性的商业软件中,推荐使用 ICU 后端,因为它能保证在所有操作系统上排序结果的绝对一致性,而不受宿主系统设置的干扰。

7. 平台差异与发布策略表

为了给架构师提供决策依据,下表总结了不同方案在各主流平台上的表现与要求。

表 7-1:GBK 支持方案的跨平台矩阵

平台方案一:原生 (ICU)方案二:Qt5Compat方案三:系统 API (System Codec)推荐策略
Windows (Qt 6.8 官方包)不支持(默认无 ICU)完美支持(需部署 DLL)不可靠(依赖用户系统区域设置)Qt5Compat
Windows (自定义编译 -icu)完美支持(需部署 ICU DLLs)完美支持不可靠原生 ICU
Linux (Ubuntu/RHEL)完美支持(系统自带 ICU)完美支持默认 UTF-8,无效原生 ICU
macOS完美支持(系统自带 ICU)完美支持默认 UTF-8,无效原生 ICU
Android支持(Qt 默认带 ICU 裁剪版)支持无效原生 ICU
Embedded Linux (Yocto)取决于配置(需启用 ICU)完美支持取决于系统Qt5Compat(若资源受限无法跑完整 ICU)

8. 总结与建议

在 Qt 6.8 及其后续版本中支持 GBK/GB18030 编码,本质上是在“现代化架构洁癖”与“遗留系统兼容”之间做出的工程权衡。

  1. 对于现有的 Windows 桌面应用迁移:
    毫无疑问,引入 Qt5Compat 模块是最具性价比的路径。它以最小的代码改动(仅需修改 include 和构建脚本)和可控的体积增加(一个 DLL),解决了 ICU 缺失带来的所有难题。
  2. 对于全新的跨平台应用:
    应尽量避免在业务逻辑层直接使用非 UTF-8 编码。在数据边界(如文件读取层),如果必须支持 GBK,建议评估是否可以自行编译带 ICU 的 Qt 版本。这能确保应用利用 Qt 6 的最新性能优化,并为未来无缝过渡到 Qt 6.10+(系统级 ICU 集成)做好准备。
  3. 对于嵌入式 Linux 设备:
    如果存储空间极度受限(Flash < 64MB),ICU 庞大的数据包可能无法接受。此时,Qt5Compat 模块反而成为了一种轻量级的替代方案,因为它只包含必要的转换表,体积远小于完整 ICU。

Qt 6.8 是一个承上启下的版本。通过精准选择 QStringConverter 或 QTextCodec,并结合对 DirectWrite 和 QCollator 的细致调优,开发者完全有能力构建出既符合现代 C++ 标准,又完美兼容中文遗留环境的卓越应用。

引用的著作
  1. Internationalization with Qt | Qt 6.10, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/internationalization.html
  2. Qt 5 Core Compatibility APIs | Qt 6.10.1, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/qtcore5-index.html
  3. Text Codec: GBK | Qt 5 Core Compatibility APIs | Qt 6.10.1 - Qt Documentation, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/qtcore5compat-attribution-qbkcodec.html
  4. c++ - Does Qt 6 only support a few common text encodings? - Stack …, 访问时间为 一月 9, 2026, https://stackoverflow.com/questions/78106455/does-qt-6-only-support-a-few-common-text-encodings
  5. Obsolete Members for QTextCodec | Qt 5 Core Compatibility APIs 6.8.6, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6.8/qtextcodec-obsolete.html
  6. QIODevice and QTextCodec? - Qt Centre, 访问时间为 一月 9, 2026, https://qtcentre.org/printthread.php?t=36330&pp=20&page=1
  7. QStringConverter - Qt for Python, 访问时间为 一月 9, 2026, https://doc.qt.io/qtforpython-6.5/PySide6/QtCore/QStringConverter.html
  8. QStringConverter Class - Developpez.com, 访问时间为 一月 9, 2026, https://qt.developpez.com/doc/6.6/qstringconverter/
  9. QStringConverter Class | Qt Core | Qt 6.10.1, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/qstringconverter.html
  10. QStringDecoder Class | Qt Core | Qt 6.10.1, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/qstringdecoder.html
  11. How to build QT6 with specific ICU version in Linux and why ICU dependency isn’t seen on Windows? | Qt Forum, 访问时间为 一月 9, 2026, https://forum.qt.io/topic/161499/how-to-build-qt6-with-specific-icu-version-in-linux-and-why-icu-dependency-isn-t-seen-on-windows
  12. Can’t access text codecs of ICU (Windows) - Qt Forum, 访问时间为 一月 9, 2026, https://forum.qt.io/topic/159445/can-t-access-text-codecs-of-icu-windows
  13. Qt for Windows - Building from Source | Qt | Qt Documentation (Pro) - Felgo, 访问时间为 一月 9, 2026, https://felgo.com/doc/qt/windows-building/
  14. Qt 5 to Qt 6 migration– a step-by-step tutorial - Spyrosoft, 访问时间为 一月 9, 2026, https://spyro-soft.com/expert-hub/qt5-to-qt-6migration-step-by-step
  15. QtCore/QTextCodec not found in Qt 6 - Stack Overflow, 访问时间为 一月 9, 2026, https://stackoverflow.com/questions/65379825/qtcore-qtextcodec-not-found-in-qt-6
  16. Replacing calls to QTextStream::setCodec() in Qt 6 | Qt - Qt Forum, 访问时间为 一月 9, 2026, https://forum.qt.io/topic/138790/replacing-calls-to-qtextstream-setcodec-in-qt-6
  17. QNetworkReply Class | Qt Network | Qt 6.10.1, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/qnetworkreply.html
  18. [SOLVED] QNetworkReply - best practices - Qt Forum, 访问时间为 一月 9, 2026, https://forum.qt.io/topic/37692/solved-qnetworkreply-best-practices
  19. What’s New in Qt 6.8 | Qt 6.10, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/whatsnew68.html
  20. QCollator Class | Qt Core| Felgo Documentation, 访问时间为 一月 9, 2026, https://felgo.com/doc/qt5/qcollator/
  21. QCollator Class | Qt Core | Qt 6.10.1, 访问时间为 一月 9, 2026, https://doc.qt.io/qt-6/qcollator.html

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询