文章目录
1 Qt中的通用模型类
1.1 Qt中的通用模型类
QStandardItemModel是一个通用的模型类:
- 能够以任意的方式组织数据(线性、非线性)。
- 数据组织的基本单位为数据项(QStandardItem)。
- 每一个数据项能够存储多个具体数据(附加数据角色)。
- 每一个数据项能够对数据状态进行控制(可编辑、可选…)。
Qt中的通用模型类QStandardItemModel:

1.2 Qt中的变体类型QVariant
QVariant:
- QVariant是一个用于封装的类型。
- QVariant能够表示大多数常见的值类型。
- QVariant每次只能封装(保存)单一类型的值。
- QVariant的意义在于能够设计“返回类型可变的函数”。
变体类型QVariant中常用的成员函数:

编程实验:变体类型QVariant的应用
#include <QtCore/QCoreApplication>
#include <QVariant>
#include <QPoint>
#include <QDebug>
QVariant func()
{
QVariant ret;
return ret;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVariant v1(1);
QVariant v2(3.14);
QVariant v3("520");
QVariant v4(QPoint(15, 15));
QVariant v5;
qDebug() << v1.type();
qDebug() << v1.typeName();
qDebug() << v1.toInt();
qDebug() << endl;
qDebug() << v2.type();
qDebug() << v2.typeName();
qDebug() << v2.toInt();
qDebug() << v2.toDouble();
qDebug() << v2.value<double>();
qDebug() << endl;
qDebug() << v3.type();
qDebug() << v3.typeName();
qDebug() << v3.toInt();
qDebug() << v3.value<QString>();
qDebug() << endl;
bool ok = true;
qDebug() << v4.type();
qDebug() << v4.typeName();
qDebug() << v4.toInt(&ok);
qDebug() << ok;
qDebug() << v4.toPoint();
qDebug() << endl;
qDebug() << v5.isValid();
return a.exec();
}
2 自定义模型类
2.1 自定义模型类设计分析
工程中的常用模型设计:
- 解析数据源中的数据(数据库、网络、串口、等)。
- 将解析后的数据存入QStandardItem对象中。
- 根据数据间的关系在QStandardItemModel对象中组织数据项。
- 选择合适的视图显示数据值。

实例分析:
- 在文件中以行的形式存储了考试成绩信息(ID、Name、Score)。
- 开发GUI程序显示文件中的信息;
- 计算平均成绩。
- 查找最好成绩和最差成绩。
- 可刷新显示的内容和删除内容。
系统架构图:

系统核心类图:

系统架构图:

2.2 自定义模型类数据层、数据表示层、数据组织层实现
先了解如下概念:
- 工程中的架构图用于定义模块接口。
- 工程中的类图用于定义具体功能的接口。
- 工程图中的流程图用于定义类对象间的交互。
- 模块实现结束后需要进行单元测试。
DataSource类的设计与实现:
- 设置数据源并读取数据。
- 对数据进行解析后生成数据对象。

ScoreInfo类的设计与实现:
- 封装数据源中的一组完成数据。
- 提供返回具体数据值的接口函数。

ScoreInfoModel类的设计与实现:
- 使用标准模型类QStandardItemModel作为成员。
- 以ScoreInfo类对象为最小单位进行数据组织。

数据交互流程图:

主要代码如下:
ScoreInfo.h:
#ifndef SCOREINFO_H
#define SCOREINFO_H
#include <QObject>
class ScoreInfo : public QObject
{
Q_OBJECT
QString m_id;
QString m_name;
int m_score;
public:
explicit ScoreInfo(QObject* parent = 0);
explicit ScoreInfo(QString id, QString name, int score, QObject* parent = 0);
ScoreInfo(const ScoreInfo& obj);
ScoreInfo& operator= (const ScoreInfo& obj);
QString id();
QString name();
int score();
};
#endif // SCOREINFO_H
ScoreInfo.cpp:
#include "ScoreInfo.h"
ScoreInfo::ScoreInfo(QObject* parent) : QObject(parent)
{
m_id = "NULL";
m_name = "NULL";
m_score = -1;
}
ScoreInfo::ScoreInfo(QString id, QString name, int score, QObject* parent)
{
m_id = id;
m_name = name;
m_score = score;
}
ScoreInfo::ScoreInfo(const ScoreInfo& obj)
{
m_id = obj.m_id;
m_name = obj.m_name;
m_score = obj.m_score;

最低0.47元/天 解锁文章
1353

被折叠的 条评论
为什么被折叠?



