数据输入与输出
本页面概述了使用 Qt 检索和保存数据的各种方法。
数据的保存与加载
QIODevice 类是Qt中所有文件和数据存储设备的基类 Qt Core。所有用于读写数据的类都继承自它。
设备示例包括QFile 、QBuffer 、QTcpSocket 和QProcess 。QFile 通过QIODevice 接口用于读写文本、二进制文件和资源。QFile 可以单独使用,但更方便的做法是与QTextStream 或QDataStream 配合使用。
QBuffer 类为QByteArray 提供了QIODevice 接口。QTcpSocket 允许开发者建立TCP连接并传输数据流。QProcess 用于启动外部程序,并向该进程读写数据。
序列化数据
Qt API 为多种使用场景提供了数据序列化支持。
- Qt 中的JSON支持提供了一个易于使用的 C++ API,用于解析、修改和保存 JSON 数据
- QDataStream 该类支持将二进制数据序列化为QIODevice
- Qt XML C++ Classes 为 XML 提供XML 流和 DOM 标准的 C++ 实现
数据库
该 Qt SQL 该模块使用驱动程序插件与多种数据库 API 进行通信。Qt 提供了适用于 SQLite、MySQL、DB2、Borland InterBase、Oracle、ODBC 和 PostgreSQL 的驱动程序。如果 Qt 未提供所需的驱动程序,您也可以自行开发驱动程序。
Qt SQL 类可分为 3 个层级:
| 层 | 用途 | 示例类 |
|---|---|---|
|
|
|
除 SQLite 之外,所有 SQL 驱动程序均可连接到托管您的数据库系统的服务器。如果您使用嵌入式 MySQL 服务器,则无需单独的 MySQL 服务器即可使用该数据库系统。
有关如何构建 SQL 数据库驱动程序的说明,请参阅SQL 数据库驱动程序。
Qt SQLite 插件非常适合本地存储。SQLite 是一个关系型数据库管理系统,包含在一个体积很小(约 350 KiB)的 C 库中。 与其他数据库管理系统不同,SQLite 并非由客户端应用程序访问的独立进程,而是其不可或缺的组成部分。SQLite 基于单个文件运行,建立连接时必须将该文件设为数据库名称。如果该文件不存在,SQLite 会尝试创建它。
SQLite 在多用户和多事务方面存在一些限制。如果您在不同事务中读取或写入同一个文件,您的应用程序可能会冻结,直到其中一个事务提交或回滚为止。
驱动程序部分配置完成后,可通过以下类访问数据:QSqlQueryModel 、QSqlTableModel 和QSqlRelationalTableModel 。QSqlTableModel 和QSqlRelationalTableModel 提供了可编辑的模型,可与 Qt 的项视图配合使用。QSqlTableModel 具有对单张表的读写权限,而QSqlRelationalTableModel 具有对主表(而非外键关联的表)的读写权限。
以下页面包含有关将 SQL 集成到应用程序中的信息:
Qt 中的 XML 支持
Qt 提供了用于读取和解析 XML 流以及向这些流写入数据的 API。以下关键类通过提供必要的基础架构来支持这些操作:
- QDomDocument 该类将整个 XML 文档表示为文档树,并提供访问文档数据的主要途径。
- 它提供了多个用于创建文档数据的方法,例如:createElement()、createTextNode()、createComment()、createCDATASection()、createProcessingInstruction()、createAttribute() 以及createEntityReference()。
- QXmlStreamReader 类提供了一个用于读取 XML 的解析器。这是一个符合 XML 1.0 规范的解析器,不包含外部已解析实体。
- 它能够识别并解析 XML 命名空间。例如,对于 StartElement,namespaceUri() 返回该元素所属的命名空间,而 name() 返回该元素的本地名称。namespaceUri() 与 name() 的组合可唯一标识一个元素。
- 由于它不会将整个 XML 文档树存储在内存中,因此不会消耗大量 CPU 资源。它仅在报告当前标记时存储该标记。
- QXmlStreamWriter 类为XML写入器提供了一个简单的流式API。它是用于写入XML的QXmlStreamReader 的对应类,并基于通过setDevice()指定的QIODevice 进行操作。
- 这是一个简单的 API,为要写入的每个 XML 标记或事件都提供了一个专用函数。
- 它在写入元素或属性时,会根据指定的 namespaceUri 自动为命名空间添加前缀。如果您必须使用某些标准化的前缀,可以通过使用 writeNamespace() 或 writeDefaultNamespace() 手动声明命名空间,从而强制写入器使用这些前缀。
- 它可以通过添加换行和缩进来自动格式化生成的 XML 数据,使其易于阅读。此功能可通过 auto-formatting 属性启用。
以下主题提供了有关Qt XML 支持的更多信息:
Qt 中的 JSON
JSON 是一种基于文本的数据交换开放标准,易于阅读和解析。它用于表示简单的数据结构和关联数组,称为对象。它与 JavaScript 相关,但是一种与语言无关的表示形式。
一个对象可以有两种形式:
| 名称/值对的集合 | 有序值列表 |
|---|---|
| |
本地存储
本地存储 API 提供了从 QML 和 JavaScript 访问 SQL 数据库中本地离线存储的功能。
这些数据库是用户特定的,也是 QML 特定的,但所有 QML 应用程序都可以访问它们。它们作为 SQLite 数据库(SQL 数据库驱动程序)存储在 QDeclarativeEngine::offlineStoragePath() 的 Databases 子目录中。
该 API 符合 HTML5 Web Database API 的同步 API 规范,即 W3C 2009 年 10 月 29 日的工作草案(HTML5 Web Database API)。
有关使用本地存储 API 的基本演示,请参阅《Qt Quick 示例 - 本地存储》。
QSettings 类
QSettings 类提供了应用程序设置的持久化存储。应用程序通常会记住上一会话的设置。
不同平台上的设置存储方式各不相同。例如,在 Windows 上,设置存储在注册表中,而在 macOS 上,则存储在 XML 文件中。
QSettings 使您能够以可移植的方式保存和恢复应用程序设置。创建和销毁QSettings 对象的过程轻量且快速。在创建QSettings 对象时,不仅应指定应用程序名称,还应指定您的组织名称,这是一种良好的实践。例如:
QSettings settings("MyCompany", "Accountancy");资源
Qt 资源系统是一种平台独立的机制,用于将二进制文件存储在应用程序的可执行文件中。如果您的应用程序频繁需要某个特定文件或一组文件,这将非常方便。它还能防止该特定文件丢失。
资源数据既可以编译到二进制文件中并在应用程序代码中立即访问,也可以由应用程序动态创建二进制资源并将其注册到资源系统中。
默认情况下,应用程序代码可通过以下方式访问资源:使用与源代码树中存储时相同的文件名(前缀为:/ ),或使用采用 qrc 方案的 URL。
连接性
文件归档
归档文件是一组文件或目录的集合,通常经过压缩,以减少它们在驱动器上占用的空间。归档文件的例子包括 ZIP、TAR、RAR 和 7z。
Qt 支持由 zlib 生成的归档文件(参见qCompress() 和 qUncompress())。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.