1. QAbstractItemModel
1.1简介
QAbstractItemModel
是Qt
框架中用于实现自定义数据模型的抽象基类。- 它提供了一种通用的方式来组织和管理数据,并**将其呈现给 Qt 的视图部件(例如 QTreeView、QTableView 等)**进行显示。
1.2目的
QAbstractItemModel
的主要目的是将底层数据抽象为一个层次化的模型,这样 Qt 的视图部件可以使用通用的方式来访问和显示这些数据。- 通过继承
QAbstractItemModel
,可以实现自己的数据模型,适应不同类型的数据源,并提供数据的查询、修改、排序和过滤等功能。
1.3方法和概念
index()
和parent()
: 这两个方法用于获取项item
在模型中的索引和其父项的索引。通过这些方法,可以构建模型的层次结构。rowCount()
和columnCount()
: 这两个方法用于获取模型中行和列的数量。子类需要实现这些方法,以提供模型的行和列信息。data()
和setData()
: 这两个方法用于获取和设置项item
的数据。当视图部件需要显示数据时,它会调用data()
方法来获取数据。当用户对视图中的数据进行修改时,setData()
方法会被调用来更新模型中的数据。headerData()
: 用于获取表头header
的数据,例如表格的行标题和列标题。flags()
: 用于获取项的标志flags
,例如是否可编辑、是否可选中等。insertRows()
和removeRows()
: 用于在模型中插入和移除行。insertColumns()
和removeColumns()
: 用于在模型中插入和移除列。beginInsertRows()
和endInsertRows()
: 这些方法用于通知视图部件模型中的数据发生了插入,视图可以相应地更新显示。beginRemoveRows()
和endRemoveRows()
: 用于通知视图部件模型中的数据将要被移除。beginResetModel()
和endResetModel()
: 用于重置整个模型,通知视图部件重新加载所有数据dataChanged()
: 用于通知视图部件模型中的数据发生了改变。layoutChanged()
: 用于通知视图部件模型的布局发生了改变,需要重新布局。
1.4总结
通过继承 QAbstractItemModel
,可以根据自己的数据结构和业务需求来实现这些方法,并将数据以层次化结构提供给 Qt 的视图部件进行显示。这样,您可以使用通用的 Qt
视图组件来展示和操作您的自定义数据模型,提高了代码的可维护性和重用性。
2. QJsonDocument
2.1 简介
QJsonDocument
是Qt
框架中用于处理JSON
(JavaScript Object Notation)数据的类。JSON
是一种轻量级的数据交换格式,常用于在不同的应用程序之间传输数据。QJsonDocument
允许您在Qt
应用程序中解析、创建和操作JSON
数据。
2.2 方法
QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = nullptr)
:从一个QByteArray
(字节数组)解析JSON
数据,返回一个QJsonDocument
对象。QJsonDocument::toJson()
:将QJsonDocument
对象中的JSON
数据转换为QByteArray
。QJsonDocument::isObject()
:检查QJsonDocument
是否表示一个JSON
对象。QJsonDocument::isArray()
:检查QJsonDocument
是否表示一个JSON
数组。QJsonDocument::isEmpty()
:检查QJsonDocument
是否为空。QJsonDocument::object()
:获取QJsonObject
,如果QJsonDocument
表示一个 JSON 对象。QJsonDocument::array()
:获取QJsonArray
,如果QJsonDocument
表示一个 JSON 数组。QJsonDocument::setObject(const QJsonObject &object)
:将一个QJsonObject
设置为QJsonDocument
的内容。QJsonDocument::setArray(const QJsonArray &array)
:将一个 QJsonArray 设置为QJsonDocument
的内容。QJsonDocument::toJson(QJsonDocument::JsonFormat format)
:将 QJsonDocument 转换为JSON
格式的QByteArray
,可以选择不同的输出格式,如Compact
或Indented
。
2.3 示例
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个 JSON 对象
QJsonObject person;
person["name"] = "John";
person["age"] = 30;
person["isStudent"] = false;
// 将 JSON 对象转换为 QJsonDocument
QJsonDocument doc(person);
// 将 QJsonDocument 转换为 JSON 格式的 QByteArray
QByteArray jsonByteArray = doc.toJson(QJsonDocument::Indented);
qDebug() << "JSON Data:";
qDebug() << jsonByteArray;
// 解析 JSON 数据
QJsonDocument parsedDoc = QJsonDocument::fromJson(jsonByteArray);
// 获取解析后的 JSON 对象
QJsonObject parsedPerson = parsedDoc.object();
// 从解析后的 JSON 对象中提取数据
QString name = parsedPerson["name"].toString();
int age = parsedPerson["age"].toInt();
bool isStudent = parsedPerson["isStudent"].toBool();
qDebug() << "\nExtracted Data:";
qDebug() << "Name: " << name;
qDebug() << "Age: " << age;
qDebug() << "Is Student: " << isStudent;
return a.exec();
}
- 在此示例中,首先创建了一个
JSON
对象,然后将其转换为QJsonDocument
。 - 接着,将
QJsonDocument
转换为JSON
格式的字节数组,并输出到控制台。 - 然后,使用
QJsonDocument::fromJson
方法解析JSON
数据,并从解析后的JSON
对象中提取数据。