首页 > 代码库 > 第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课 自定义模型类(上)