第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)。

时间: 2024-12-28 16:11:38

第58课 自定义模型类(上)的相关文章

第60课 自定义模型类(下)

1. 界面GUI设计 2. 界面的类图设计 3. 右键上下文菜单的实现 (1)定义菜单对象(QMenu) (2)连接菜单中QAction对象到槽函数 (3)定义事件过滤器,并处理ContextMenu事件 (4)在当前鼠标的位置打开菜单对象 [编程实验]数据应用界面和右键菜单的实现 //main.cpp #include "Widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplic

第59课 自定义模型类(中)

1. 系统架构图(续上节的实例分析) 2. 类的设计与实现 (1)DataSource类的设计与实例 ①设置数据源并读取数据 ②对数据进行解析后生成数据对象 (2)ScoreInfo类的设计与实现 ①封装数据源中的一组完整数据(即一条记录信息) ②提供返回具体数据值的接口函数 (3)ScoreInfoModel类的设计与实现 ①使用标准模型类QStandardItemModel作为成员(这里采用组合方式,而不采用继承) ②以ScoreInfo类对象为最小单位进行数据组织 3. 数据交互流程图 [

第五十八课、自定义模型类(上)------------------狄泰软件学院

 一.自定义模型类 1.QStandardItemModel是一个通用的模型类 (1).能够以任意的方式组织数据(线程.非线性) (2).数据组织的基本单位为数据项(QStandardItem) (3).每一个数据项能够存储多个具体数据(附加数据角色) (4).每一个数据项能够对数据状态进行控制(可编辑.可选...) 2.Qt中的通用模型类QStandardItemModel (1).QStandardItemModel继承自抽象的模型类QAbstractItemModel (2).QStand

Flask之自定义模型类

4.3自定义模型类 定义模型 模型表示程序使用的数据实体,在Flask-SQLAlchemy中,模型一般是Python类,继承自db.Model,db是SQLAlchemy类的实例,代表程序使用的数据库. 类中的属性对应数据库表中的列.id为主键,是由Flask-SQLAlchemy管理.db.Column类构造函数的第一个参数是数据库列和模型属性类型. 如下示例:定义了两个模型类,作者和书名. #coding=utf-8 from flask import Flask,render_templ

自定义模型绑定系统

一.创建自定义的值提供器 1.通过创建自定义的值提供器,我们可以把自己的数据源添加到模型绑定过程.而值提供器需要实现IValueProvider接口.下面是此接口的定义 namespace System.Web.Mvc { /// <summary> /// Defines the methods that are required for a value provider in ASP.NET MVC. /// </summary> public interface IValue

自定义MVC框架之工具类-模型类

截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理类 这个模型类支持以下功能: >连贯操作,js叫链式操作,连贯操作的函数可以打乱顺序,最后一个函数必须是执行语句的那个函数,如select, delete, update, add等 如 $db->table( 'user' )->where( 'id=1' )->select() 等

ThinkPHP3验证码、文件上传、缩略图、分页(自定义工具类、session和cookie)

验证码 TP框架中自带了验证码类 位置:Think/verify.class.php 在LoginController控制器中创建生存验证码的方法 login.html登陆模板中 在LoginController控制器中判断验证码是否正确并且判断登陆是否成功 文件上传 用到的知识点: 1.文件上传的时候,要设置表单的enctype属性 2.$_FILE[名字][]用来接收文件的信息 第二维的字段: name size error type tmp_name 3.move_uploaded_fil

发布新的模型类包(用于上传到 NuGet 服务器上)

生成包文件: 1.修改了模型类之后,在项目上点击右键,在列表菜单中选择 “编辑 …….csproj”,然后将里面的三个版本号都换成新的版本号. 2.右键项目,点击“打包” 3.复制输出信息中生成的包的文件夹(注意,复制文件夹路径)路径,如 “1>Successfully created package 'D:\ProjectCode\……\bin\Debug\…….1.8.5.nupkg'.” 中的 “D:\ProjectCode\……\bin\Debug”(用Debug发布也不影响) 4.需要

自定义的类传数据到主窗口控件上的方法

最近在做那个比赛,需要数据不断的从自定义的类中更新到主窗口中,调试了好久现在终于解决了,方法如下: 1.自己定义了一个类 2.然后在主窗口中调用这个类中的一个函数 3.然后再在自定义的类中调用主窗口中的函数 3.这是主窗口中被调用的函数: 之前到了第3步中是直接定义dialog的一个指针然后调用dialog中的函数,数据是传过去了但是一直出错,后来定义了一个dialog的全局对象就好了 然后再自定义的类中的cpp中添加 extern CThreadDlg *cdlg; 这样问题就解决了--