当前位置: 首页 > news >正文

Qt5开发从入门到精通——第八篇二节( 模型/视图结构—— 模型 (Model))

CSDN话题挑战赛第2期
参赛话题:学习笔记

欢迎小伙伴的点评✨✨,相互学习c/c++应用开发。🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀

目录

  • 前言
  • 一、 模型 (Model) 概述
  • 二、效果实例
  • 三、原码解析
    • modelex.h
    • main.cpp
    • modelex.cpp
  • 四、总结

前言

本章节会给大家带来模型/视图结构的 模型 (Model)详解。

一、 模型 (Model) 概述

实现自定义模型可以通过 QAbstractltemModel 类继承,也可以通过 QAbstractListModel 和QAbstractTableModel 类继承实现列表模型或表格模型。
在数据库中,通常需要首先将一些重复的文字字段使用数值代码保存,然后通过外键关联操作来查找其真实的含义,这一方法是为了避免冗余。
Item 主要的角色及其描述
Qt: :DisplayRole :显示文字
Qt::DecorationRole :绘制装饰数据(通常是图标)
Qt::EditRole :在编辑器中编辑的数据
Qt::ToolTipRole :工具提示
Qt::StatusTipRole :状态栏提示
Qt::WhatsThisRole :What’s This 文字
Qt::SizeHintRole :尺寸提示
Qt::FontRole :默认代理的绘制使用的字体
Qt::TextAlignmentRole : 默认代理的对齐方式
Qt::Background.Role :默认代理的背景画刷
Qt::ForegroundRole :默认代理的前景画刷
Qt::CheckStateRole :默认代理的检查框状态
Qt::UserRole :用户自定义的数据的起始位置

二、效果实例

图一
在这里插入图片描述

三、原码解析

modelex.h

#ifndef MODELEX_H
#define MODELEX_H

#include <QWidget>
#include <QAbstractTableModel>
#include <QVector>
#include <QMap>
#include <QStringList>
class ModelEx : public QAbstractTableModel
{
    Q_OBJECT

public:
    explicit ModelEx(QObject *parent=0);


    //虚函数声明
    /*rowCountO 、 columnCountO 、 dataO和返回表头数据的 headerDataO函数是 QAbstract
TableModel 类的纯虚函数。*/
    virtual int rowCount (const QModelIndex &parent=QModelIndex ()) const;
    virtual int columnCount (const QModelIndex &parent=QModelIndex ()) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData (int section, Qt::Orientation orienation, int role)const;

signals:


public slots:
private:
    QVector<short> army;
    QVector<short> weaponType;
    QMap<short,QString> armyMap; //使用 QMap 数据结构保存“数值一文字”的映射
    QMap<short,QString> weaponTypeMap;
    QStringList weapon;
    QStringList header;
    void populateModel(); //完成表格数据的初始化填充

};

#endif // MODELEX_H

main.cpp

#include "modelex.h"
#include <QApplication>
#include <QTableView>
int main(int argc, char *argv[])
{
    QApplication a(argc,argv);
    ModelEx modelEx;
    QTableView view;
    view.setModel(&modelEx);
    view.setWindowTitle(QObject:: tr("modelEx"));
    view.resize(400,400);
    view.show();
    return a.exec();
}

modelex.cpp

#include "modelex.h"

ModelEx::ModelEx(QObject *parent):QAbstractTableModel(parent)
{
    armyMap[1]=tr(" 空军") ;
    armyMap[2]=tr(" 海军") ;
    armyMap[3]=tr(" 陆军") ;
    armyMap[4]=tr(" 海军陆战队") ;
    weaponTypeMap[1]=tr(" 轰炸机") ;
    weaponTypeMap[2]=tr(" 战斗机") ;
    weaponTypeMap[3]=tr(" 航空母舰");
    weaponTypeMap[4]=tr(" 驱逐舰") ;
    weaponTypeMap[5]=tr(" 直升机") ;
    weaponTypeMap[6]=tr(" 坦克") ;
    weaponTypeMap[7]=tr(" 两栖攻击舰");
    weaponTypeMap[8]=tr(" 两栖战车");
    populateModel();
}


void ModelEx::populateModel()
{
    header<<tr(" 军种")<<tr(" 种类 ")<<tr(" 武器");
    army<<1<<2<<3<<4<<2<<4<<3<<1;
    weaponType<<1<<3<<5<<7<<4<<8<<6<<2;
    weapon<<tr("B-2")<<tr(" 尼米兹级 ")<<tr(" 阿帕奇 ")<<tr(" 黄蜂级")
    <<tr(" 阿利伯克级 ")<<tr("AAAV")<<tr("MlAl")<<tr("F一 22");
}

/*columnCountO 函数中,因为模型的列固定为 "3", 所以直接返回 "3" 。*/
int ModelEx::columnCount(const QModelIndex &parent) const
{
    return 3;
}

/*rowCount() 函数返回模型的行数。*/
int ModelEx::rowCount(const QModelIndex &parent) const
{
    return army.size() ;
}


/*data() 函数返回指定索引的数据,即将数值映射为文字。*/
QVariant ModelEx::data(const QModelIndex &index, int role) const
{
    if (!index.isValid ())
       return QVariant();
    if(role==Qt::DisplayRole)
    {





    switch(index.column())
    {
    case 0:
    return armyMap[army[index.row()]];
    break;
    case 1:
    return weaponTypeMap[weaponType[index.row()]];
    break;
    case 2:
    return weapon[index.row()];
    default:
    return QVariant() ;
    }




    }
    return QVariant();
}


/*headerDataO 函数返回固定的表头数据,设置水平表头的标题,*/
QVariant ModelEx::headerData(int section, Qt::Orientation orientation, int role)const
{
    if(role==Qt::DisplayRole&&orientation==Qt::Horizontal)
        return header[section];
    return QAbstractTableModel::headerData(section,orientation,role);
}



四、总结

模型/视图结构—— 模型 (Model)会在应用程序开发中经常用到的

相关文章:

  • 【Django】开发日报_13_Day:手机号码管理系统(11)
  • 用递归函数和栈操作逆序栈
  • java基于SpringBoot+Vue的学生选课作业系统 element
  • Excel数据分析
  • 机智云无需代码就能搞定IoT小程序开发和管理
  • RocketMQ 消费者拉取消息(Pull) 解析——图解、源码级解析
  • 字符串函数的详解
  • 【BOOST C++指针专题07】Boost.Pool
  • C# 文件/文件夹操作(文本写入,追加,覆盖,清空,文件/文件夹新建,复制,删除,移动)+驱动器+目录+路径+Path类大全
  • Less预处理——变量和嵌套
  • BEVerse 中数据集预处理代码浅析
  • 算法每日一题(合并两个有序的数组)
  • SpringBoot整合Swagger
  • ProcExp的利用
  • C++内存管理
  • 【node学习】协程
  • 07.Android之多媒体问题
  • Bootstrap JS插件Alert源码分析
  • centos安装java运行环境jdk+tomcat
  • flutter的key在widget list的作用以及必要性
  • Laravel Mix运行时关于es2015报错解决方案
  • opencv python Meanshift 和 Camshift
  • Rancher-k8s加速安装文档
  • react 代码优化(一) ——事件处理
  • spring学习第二天
  • web标准化(下)
  • 仿天猫超市收藏抛物线动画工具库
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 小程序开发中的那些坑
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​虚拟化系列介绍(十)
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ###STL(标准模板库)
  • $.ajax,axios,fetch三种ajax请求的区别
  • $jQuery 重写Alert样式方法
  • (12)目标检测_SSD基于pytorch搭建代码
  • (C++)八皇后问题
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (力扣)循环队列的实现与详解(C语言)
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (强烈推荐)移动端音视频从零到上手(下)
  • (区间dp) (经典例题) 石子合并
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)基于IDEA的JAVA基础10
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)【Hibernate总结系列】使用举例
  • ./configure、make、make install 命令
  • .NET delegate 委托 、 Event 事件
  • .NET 的程序集加载上下文
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net语言中的StringBuilder:入门到精通
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑