首页 > 代码库 > 第58课 自定义模型类(上)
第58课 自定义模型类(上)
1. QStandardItemModel是一个通用的模型类
(1)能够以任意的方式组织数据(线性、非线性)
(2)数据组织的基本单位为数据项(QStandardItem)
(3)每一个数据项能够存储多个具体数据(可通过附加数据角色加以区别)
(4)每一个数据项能够对数据状态进行控制(可编辑、可选、……)
2. Qt中的通用模型类:QStandartItemModel
(1)QStandardItemModel继承自QAbstractItemModel。
(2)QStandardItemModel通用模型是以QStandardItem为单位来组织数据的。
(3)QStandartItemModel可通过QModelIndex获取到数据项的索引值,然后通过索引获得其中的数据(QVariant类)
(4)可以不同视图(QTableView、QListView、QTreeView)来显示QStandardItemModel模型中的数据。
3. Qt中的变体类型
(1)QVariant类
①QVariant是一个用于封装各种类型数据的类型
②QVariant能够表示大多数常见的值类型。(如可通过其toInt、toBool、toString、toDate等来转换一些常见的数据类型)
③QVariant每次只能封装(保存)单一类型的值
④QVariant的意义在于能够设计“返回类型可变的函数”
(2)变体类型QVariant中的常用成员函数
①bool isNull();
②bool isValid();//是否有效
③void setValue(const T&);
④Type type();//返回所封装值的类型,如QVariant::int
⑤const char* typeName();//以字符串返回所封装值的类型名称。如int
⑥T value();//将所存储的值转为泛型T所指的类型
【编程实验】变体类型QVariant的应用
#include <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); //封装double型数据 QVariant v3("520"); //封装字符串型数据 QVariant v4(QPoint(15, 15)); QVariant v5; //QVariant是用于封装数据的,这里不指定数据类型 //会导致isValid返回false,表示无效数据 qDebug() << v1.type(); //输出: QVariant::int qDebug() << v1.typeName(); //输出: int qDebug() << v1.toInt(); //输出: 1 qDebug() << endl; qDebug() << v2.type(); //输出: QVariant::double qDebug() << v2.typeName(); //输出:double qDebug() << v2.toInt(); //输出: 3。 double转为int,发生截断 qDebug() << v2.toDouble(); //输出:3.14 qDebug() << v2.value<double>(); //输出3.14 value()函数用于将存储型转为 //泛型T所指的类型,这里转为double qDebug() << endl; qDebug() << v3.type(); //输出: QVariant::QString qDebug() << v3.typeName(); //输出: QString qDebug() << v3.toInt(); //输出: 520,因为字符串”520“可转化为数字 qDebug() << v3.toString(); //输出: "520"; qDebug() << v3.value<QString>(); //输出: "520" qDebug() << endl; bool ok = true; qDebug() << v4.type(); //输出: QVariant::QPoint qDebug() << v4.typeName(); //输出: QPoint qDebug() << v4.toInt(&ok); //输出: 0 qDebug() << ok; //输出: false,表示上一步的转换失败 qDebug() << v4.toPoint(); //输出:QPoint(15,15); qDebug() << v4.value<QPoint>(); //输出: QPoint(15,15) qDebug() << endl; qDebug() << v5.type(); //输出:QVariant::Invalid qDebug() << v5.typeName(); //输出: (无输出) qDebug() << v5.isValid(); //输出: false,表示因没指定存储的数据类型而导致 //数据是无效的 return a.exec(); }
4. 工程中的常用模型设计
(1)解析数据源中的数据(数据库、网络、串口等)
(2)将解析后的数据存入QStandardItem对象中
(3)根据数据间的关系在QStandardItemModel对象中组织数据项
(4)选择合适的视图显示数据值
5. 实例分析
(1)需求分析
①在文件中以行的形式存储了考试成绩信息(ID、Name、Score)
②开发GUI程序显示文件中的信息。包括计算平均成绩、查找最好和最差成绩、可刷新显示的内容和删除内容。
(2)系统架构图
(3)系统核心类图
(4)系统实现
to be continued…
6. 小结
(1)QStandardItemModel是一个通用的模型类
(2)QStandardItemModel能够以任意的方式组织数据
(3)使用QVariant能够设计“返回类型可变的函数”
(4)工程中常用数据应用架构为4层结构:
①数据层(如DataSource)
②数据表示层(如ScoreInfo)
③数据组织层(如ScoreInfoModel)
④数据显示层(如QTableView)。
第58课 自定义模型类(上)