数据输入 输出

本页概述了使用 Qt 检索和保存数据的各种方法。

保存和加载数据

QIODevice 类是 Qt 中所有文件和数据存储设备的基类。 Qt Core.所有用于读写数据的类都继承自它。

设备的例子有QFile,QBuffer,QTcpSocket, 和QProcessQFile 用于读写文本、二进制文件和资源,使用QIODevice 接口。QFile 可单独使用,也可与QTextStreamQDataStream 一起使用。

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 层:

目的示例类
  • 驱动层
  • SQL API 层
  • 用户界面层
  • 数据库与 SQL API 层之间的底层通信
  • 提供对数据库的访问
  • 将数据库中的数据链接到数据感知部件

除 SQLite 外,所有 SQL 驱动程序都可以连接到托管数据库系统的服务器。如果使用嵌入式 MySQL 服务器,则无需 MySQL 服务器即可使用该数据库系统。

有关如何构建 SQL 数据库驱动程序的说明,请参阅SQL 数据库驱动程序

Qt SQLite 插件非常适合本地存储。SQLite 是一种关系数据库管理系统,包含在一个很小(约 350 KiB)的 C 库中。与其他数据库管理系统不同的是,SQLite 不是一个从客户端应用程序访问的独立进程,而是客户端应用程序不可分割的一部分。SQLite 在单个文件上运行,打开连接时必须将该文件设置为数据库名称。如果文件不存在,SQLite 将尝试创建它。

SQLite 对多用户和多事务有一些限制。如果从不同的事务中读取或写入文件,应用程序可能会冻结,直到其中一个事务提交或回滚。

一旦设置好驱动程序部分,就可以使用QSqlQueryModelQSqlTableModelQSqlRelationalTableModel 等类访问数据。QSqlTableModelQSqlRelationalTableModel 提供了可与 Qt 的项目视图一起使用的可编辑模型。QSqlTableModel 对单个表具有读/写访问权限,而QSqlRelationalTableModel 对主表(而非具有外键的表)具有读/写访问权限。

以下页面包含有关在应用程序中使用 SQL 的信息:

Qt 中的 XML 支持

Qt 提供了读取和解析 XML 流以及向这些流写入的 API。以下关键类通过提供必要的基础架构为这些操作提供了便利:

  • QDomDocument 类以文档树的形式表示整个 XML 文档,并提供对文档数据的主要访问。
  • QXmlStreamReader 类提供了一个读取 XML 的解析器。它是一个格式良好的 XML 1.0 解析器,不包含外部解析实体。
    • 它能理解并解析 XML 命名空间。例如,对于 StartElement,namespaceUri() 返回元素所在的命名空间,name() 返回元素的本地名称。namespaceUri() 和 name() 的组合可以唯一标识一个元素。
    • 由于不会在内存中存储整个 XML 文档树,因此不会占用 CPU 资源。它只存储报告时的当前标记。
  • QXmlStreamWriter 类提供了一个具有简单流 API 的 XML 写入器。它与QXmlStreamReader 相对应,用于写入 XML,并在通过 setDevice() 指定的QIODevice 上运行。
    • 它是一个简单的 API,可为您要写入的每个 XML 标记或事件提供一个专用函数。
    • 在编写元素或属性时,它会根据指定的 namespaceUri 为命名空间添加前缀。如果您必须使用某些标准化的前缀,可以使用 writeNamespace() 或 writeDefaultNamespace() 手动声明命名空间,从而强制写入器使用这些前缀。
    • 它可以通过添加换行符和缩进来自动格式化生成的 XML 数据,使其具有可读性。该功能可通过自动格式化属性开启。

以下主题提供了有关Qt XML 支持的更多信息:

Qt 中的 JSON

JSON 是一种基于文本的数据交换开放标准,易于阅读和解析。它用于表示简单的数据结构和关联数组(称为对象)。它与 JavaScript 有关,但却是一种与语言无关的符号形式。

对象有两种形式

名称/值对的集合值的有序列表
{
          "last_name": "Routledge",
          "first_name": "Ronald",
          "birth_date": 1960
}
"colors": ["green", "blue", "yellow"]

本地存储

本地存储 API 提供了从 QML 和 JavaScript 访问 SQL 数据库中本地离线存储的能力。

这些数据库是特定于用户和 QML 的,但所有 QML 应用程序都可访问。它们作为 SQLite 数据库(SQL 数据库驱动程序)存储在 QDeclarativeEngine::offlineStoragePath() 的 Databases 子目录中。

该 API 符合 HTML5 Web 数据库 API 的同步 API,W3C 2009 年 10 月 29 日工作草案(HTML5 Web 数据库 API)。

有关使用本地存储 API 的基本演示,请参见Qt Quick Examples - Local Storage

QSettings 类

QSettings 类提供应用程序设置的持久存储。应用程序通常会记住上一个会话的设置。

不同平台上的设置存储方式不同。例如,在 Windows 上,它们存储在注册表中,而在 macOS 上,它们存储在 XML 文件中。

QSettings 而在 MacOS 上,设置则存储在 XML 文件中。构建和销毁 对象既轻便又快捷。在创建 对象时,最好不仅指定应用程序名称,还要指定组织名称。例如QSettings QSettings

QSettings settings("MyCompany", "Accountancy");

资源

Qt 资源系统是一种独立于平台的机制,用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序经常需要某个或某组文件,这将非常方便。它还能防止丢失特定文件。

资源数据既可以编译到二进制文件中并在应用程序代码中立即访问,也可以动态创建二进制资源并由应用程序在资源系统中注册。

默认情况下,应用程序代码可通过与源代码树中存储的文件名相同的文件名(带有:/ 前缀)或带有 qrc 方案的 URL 访问资源。

连接性

文件归档

归档文件是文件或目录的集合,通常经过压缩,以减少它们在驱动器上占用的空间。归档文件的例子有 ZIP、TAR、RAR 和 7z。

Qt 支持由 zlib 制作的压缩文件(请参阅qCompress() 和 qUncompress())。

© 2025 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.