数据输入输出#
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())。