数据输入输出#

Qt的数据输入输出

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

保存和加载数据#

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

设备的例子有QFile、QBuffer、QTcpSocket和QProcess。QFile用于读写文本文件、二进制文件和资源,使用QIODevice接口。QFile可以单独使用,也可以更方便地与QTextStream或QDataStream一起使用。

QBuffer类为QByteArray提供了QIODevice接口。QTcpSocket使开发者能够建立TCP连接并传输数据流。QProcess用于启动外部程序,并从中读取或写入。

  • 输入/输出和网络(与I/O相关的类列表)

  • 文件和数据流函数

序列化数据#

Qt API为几个用例提供了数据序列化的支持。

  • Qt中对JSON的支持提供了一个易于使用的C++ API来解析、修改和保存JSON数据

  • QDataStream类提供将二进制数据序列到QIODevice的接口

  • Qt XML C++类提供了XML流和DOM标准的C++实现

数据库#

Qt SQL模块使用驱动插件与多个数据库API通信。Qt提供了SQLite、MySQL、DB2、Borland InterBase、Oracle、ODBC和PostgreSQL的驱动程序。如果Qt未提供所需的驱动程序,也可以开发自己的驱动程序。

Qt的SQL类可以分为3层

层级

目的

示例类

  • 驱动层

  • SQL API层

  • 用户界面层

  • 数据库与SQL API层之间的底层通信

  • 提供访问数据库的接口

  • 将数据库中的数据连接到数据感知小部件

  • QSqlDriver, QSqlDriverCreator

  • QSqlDatabase, QSqlQuery

  • QSqlQueryModel (只读), QSqlTableModel (读/写), QSqlRelationalTableModel (读/写支持外键)

除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 纳入应用程序的信息

  • SQL 编程

    • 数据库类

    • 执行 SQL 语句

    • 使用 SQL 模型类

    • 在表格视图中呈现数据

    • 创建数据感知表单

Qt 的 XML 支持#

Qt 提供了用于读取、解析 XML 流以及写入这些流的 API。以下关键类通过提供必要的基础设施来简化这些操作:

  • QDomDocument 类表示整个 XML 文档作为一个文档树,并提供对文档数据的初级访问。

    • 它提供创建文档数据的几个函数,例如 createElement()、createTextNode()、createComment()、createCDATASection()、createProcessingInstruction()、createAttribute() 和 createEntityReference()。

  • QXmlStreamReader 类提供了一个解析器,用于读取 XML。它是一个带有外部解析实体的 Well-formed XML 1.0 解析器。

    • 它理解并解析 XML 命名空间。例如,对于 StartElement,namespaceUri() 返回元素所在的命名空间,而 name() 返回元素的本地名称。namespaceUri() 和 name() 的组合可唯一标识一个元素。

    • 它不耗费 CPU 资源,因为它不会将整个 XML 文档树存储在内存中,而只存储在报错时报告的当前标记。

  • QXmlStreamWriter 类提供了一个具有简易流式 API 的 XML 写入器。它是 QXmlStreamReader 的对应物,用于写入 XML,并在 setDevice() 指定的 QIODevice 上操作。

    • 这是一个简单的 API,为每个您想要写入的 XML 标记或事件提供专门的函数。

    • 它会根据写入元素或属性时的命名空间Uri自动添加命名空间前缀。如果您必须使用某些标准化前缀,可以手动使用 writeNamespace() 或 writeDefaultNamespace() 声明命名空间,强制写入器使用它们。

    • 它可以自动格式化生成的 XML 数据,通过添加换行符和缩进,使其易读。该功能可以通过自动格式化属性打开。

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

  • 命名空间简介

  • XML 流

Qt 中的 JSON#

JSON 是一种用于简单数据结构(称为对象)表示和交换的文本基础开放标准。它是易读和解析的。用于表示名称/值对集合和有序值列表,与 JavaScript 有关,但是一种语言无关的表示形式。

对象可以采取两种形式:

名称/值对的集合

值列表

{
          "last_name": "Routledge",
          "first_name": "Ronald",
          "birth_date": 1960
}
"colors": ["green", "blue", "yellow"]
  • Qt 中的 JSON 支持

  • 保存和加载游戏

  • 序列化转换器

本地存储#

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

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

API 符合 HTML5 Web 数据库 API(W3C Working Draft 29 October 2009)的同步 API。

请参阅 Qt Quick 示例 - 本地存储,了解使用本地存储 API 的基本演示。

  • Qt Quick 本地存储 QML 类型

QSettings 类#

QSettings 类提供了应用设置的持久存储。应用通常可以记住之前的会话设置。

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

QSettings 使您能够以可移植的方式保存和恢复应用设置。构造和销毁 QSettings 对象轻量且快速。在创建 QSettings 对象时,除了指定应用名称外,还应指定您的组织名称。例如

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

资源#

Qt 资源系统 是一种平台无关机制,用于在应用的可执行文件中存储二进制文件。如果您的应用经常需要某些文件,或一组文件,这将非常有用。它还可以防止特定文件丢失。

资源数据可以编译到二进制中并立即在应用代码中访问,或者由应用动态创建二进制资源,并通过资源系统进行注册。

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

连接#

  • Qt 串行端口

  • Qt Modbus

  • Qt CAN 总线

  • Qt 蓝牙

  • Qt NFC

文件归档#

归档文件是一组文件或目录的集合,通常为了减少它们在驱动器上占用的空间而进行压缩。归档文件的示例包括 ZIP、TAR、RAR 和 7z。

Qt 支持由 zlib 产生的归档(请参阅 qCompress() 和 qUncompress())。