数据输入输出

此页面提供了使用 Qt 检索和保存数据的多种方式的概述。

保存和加载数据

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

设备的例子有 QFileQBufferQTcpSocket 以及 QProcessQIODevice 接口用于 QFile 读取和写入文本、二进制文件以及资源,使用 QIODevice 接口。可以单独使用 QFile,或者更方便地与 QTextStreamQDataStream 一起使用。

QBuffer 类为 QByteArray 提供了 QIODevice 接口。 QTcpSocket 可以让开发人员建立 TCP 连接并传输数据流。 QProcess 用于启动外部程序,并从这个进程读取和写入。

序列化数据

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

  • Qt 中的 JSON 支持提供了一个易于使用的 C++ API 来解析、修改和保存 JSON 数据
  • QDataStream 类提供了将二进制数据序列化到 QIODevice 的功能
  • Qt XML C++ 类 为 XML 提供了 C++ 实现的 XML 流和 DOM 标准接口

数据库

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在多用户和多事务方面有一些限制。如果您在来自不同事务的文件上进行读写操作,应用程序可能会冻结,直到其中一个事务提交或回滚。

一旦设置好驱动程序部分,就可以使用以下类访问数据:QSqlQueryModelQSqlTableModelQSqlRelationalTableModelQSqlTableModelQSqlRelationalTableModel提供了可编辑的模型,可以与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()的组合可以唯一标识一个元素。
    • 它不是一个CPU密集型操作,因为它不会将整个XML文档树存储在内存中。它只存储报告时的当前标记。
  • QXmlStreamWriter类提供了一个具有简单流API的XML写入器。它是QXmlStreamReader的对应部分,用于写入XML,并且它在一个通过setDevice()指定的QIODevice上操作。
    • 它是一个简单的API,为每个要写入的XML标记或事件提供了一个专用函数。
    • 它会在编写元素或属性时根据指定的命名空间URI添加命名空间前缀。如果您必须使用某些标准前缀,可以通过手动声明命名空间来强制写入器使用,这可以通过writeNamespace()或writeDefaultNamespace()方法完成。
    • 它可以通过添加换行符和缩进来自动格式化生成的XML数据,使数据可读。可以通过自动格式化属性打开此功能。

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

Qt中的JSON

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

对象可以采取两种形式

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

本地存储

Local Storage API提供从QML和JavaScript访问本地SQLite数据库的能力。

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

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

有关使用Local Storage 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())。

© 2024 Qt公司有限 公司。 本文档中包含的贡献是各自的版权拥有者的版权。 本文档是按照自由软件基金会发布的GNU自由文档许可证版本1.3的条款提供许可的。Qt及其相关标志是福兰斯isin和其他全球国家的Qt公司有限公司的商标。所有其他商标归其各自所有者所有。