模型视图设计模式的核心思想

  • 使模型(数据)与视图(显示)相分离
  • 模型只需要对外提供标准接口存取数据,无需数据如何显示
  • 视图只需要自定义数据的显示方式,无需数据如何组织存储
  • 当数据发生改变时,会通过信号通知视图
  • 当用户与视图进行交互时,会通过信号向模型发送交互信息

 

在QT中提供了以下几种预定义模型:

其中QStandardItemModel的常见子类有:

  • QAbstractListModel:用来创建一维列表模型
  • QStandardItemModel:用来存储定制数据的通用模型
  • QAbstractTableModel: 用来创建二维列表模型

常用的视图类层次结构,如下所示:

在Qt中,不管模型以什么结构组织数据,都必须为每个数据提供不同的索引值,使得视图能通过索引值访问模型中的具体数据

以QTreeView视图为例

    QWidget w;

    QFileSystemModel  model(&w);              //定义文件系统模型

    QTreeView   treeView(&w);                 //定义树形显示视图

    treeView.resize(,);

    model.setRootPath(QDir::currentPath()); //设置根目录

    treeView.setModel(&model);          //连接模型与视图

    treeView.setRootIndex(model.index(QDir::currentPath()));
// setRootInedex():设置树形显示视图的数据索引,以当前目录为根部显示
// QModelIndex index(QDir::currentPath()):以当前目录为模型项索引 w.show();

效果:

其中index()是个重载函数,用来获取QModelIndex 索引值,完整的index()函数如下所示:

QModelIndex QAbstractItemModel::index ( int row, int column, const QModelIndex & parent = QModelIndex() );
//返回指定的row(行)、column(列)、parent(父索引)引所在的索引值

对于不同的模型视图而言,row(行)、column(列)、parent(父索引)的效果如下所示:

以QFileSystemModel为例:

也可以通过index索引值来查找数据,以QFileSystemModel模型为例, 与index相关的成员函数有:

QIcon     fileIcon ( const QModelIndex & index );    //通过索引值获取文件图标
QFileInfo fileInfo ( const QModelIndex & index ); //通过索引值获取文件信息
QString fileName ( const QModelIndex & index ) ; //通过索引值获取文件名
QString filePath ( const QModelIndex & index ) ; //通过索引值获取文件路径
bool isDir ( const QModelIndex & index ) ; //通过索引值,判断是否是目录 int columnCount ( const QModelIndex & parent = QModelIndex() ) ;
//通过索引值获取当前列数 int rowCount ( const QModelIndex & parent = QModelIndex() ) ; //通过索引值获取行数 QModelIndex parent ( const QModelIndex & index ) ; //通过索引值获取其父节点的索引值 QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) ;
//通过索引值获取模型数据 bool setData ( const QModelIndex & idx, const QVariant & value, int role = Qt::EditRole );
//通过索引值设置模型数据

其中data ()setData() 函数的参数role 是模型数据角色

role 数据角色

当role值不同时,则显示在视图上的方式也会不同

对于role角色,常用的值有:

  • Qt::DisplayRole             0          以文本方式显示数据(QString)
  • Qt::DecorationRole       1         将数据作为图标来装饰(QIcon,QPixmap)
  • Qt::EditRole                   2          可编辑的数据信息显示(QString)
  • Qt::ToolTipRole             3          作为工具提示显示(QString)
  • Qt::StatusTipRole          4         作为状态栏中显示的数据(QString)
  • Qt::WhatsThisRole        5         作为帮助信息栏中显示的数据(QString)
  • Qt::FontRole                   6        设置字体(QFont)
  • Qt::TextAlignmentRole   7       设置模型数据的文本对齐(Qt::AlignmentFlag)
  • Qt::BackgroundRole      8        设置模型数据的背景色(QBrush)
  • Qt::ForegroundRole      9         设置模型数据的前景色,比如字体(QBrush)

 

以QTableView为例

    QWidget w;
QTableView view(&w);
QStandardItemModel model(&w);
view.setModel(&model); //设置视图的模型 QStandardItem itemA; /*设置text*/
itemA.setData("A",Qt::DisplayRole); /*设置图标*/
QPixmap pix(":user.png");
pix = pix.scaled(,,Qt::KeepAspectRatio);
itemA.setData(pix,Qt::DecorationRole); /*设置渐变背景色*/
QLinearGradient back(,,,);
back.setColorAt(,Qt::white);
back.setColorAt(0.5,Qt::green);
back.setColorAt(,Qt::blue);
itemA.setData(QBrush(back),Qt::BackgroundRole); model.setItem(,,&itemA);
model.setItem(,,new QStandardItem(QIcon(pix),"B"));
model.setItem(,,new QStandardItem(QIcon(pix),"C")); w.show();

效果:

QTableView详细使用请参考:24.QTableView函数使用,右击菜单实现

接下来开始学习模型视图中的委托

25.QT-模型视图的更多相关文章

  1. Qt模型/视图、委托

    MVC视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了数据与呈现给用户的方式,使得它可以在几个不同的视图中显示相同的数据,并实现新类型的视图而无需改变底层的数据结构.为了灵活的处理数据输入, ...

  2. Qt 模型/视图/委托

    模型.视图.委托 模型/视图架构基于MVC设计模式发展而来.MVC中,模型(Model)用来表示数据:视图(View)是界面,用来显示数据:控制(Controller)定义界面对用户输入的反应方式. ...

  3. 38.Qt模型/视图结构

    1.模型/视图类 2.模型 3.视图 4.代理 1 模型/视图类 InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringL ...

  4. Qt 模型/视图结构

    MVC是一种与用户界面相关的设计模式.通过使用此模型,可以有效地分离数据和用户界面.MVC设计模式包含三要素:表示数据的模型(Model).表示用户界面的视图(View)和定义了用户在界面上的操作控制 ...

  5. Qt模型/视图框架----简单的例子

    #include<qapplication.h> #include<qfilesystemmodel.h> #include<qtreeview.h> #inclu ...

  6. Qt模型视图结构遇见的小问题

    在本文的最开始,我们来看两个帮助文档内容: selectionMode : SelectionMode This property holds which selection mode the vie ...

  7. Qt之模型/视图(自定义进度条)

    简述 在之前的章节中分享过关于QHeaderView表头排序.添加复选框等内容,相信大家模型/视图.自定义风格有了一定的了解,下面我们来分享一个更常用的内容-自定义进度条. 实现方式: 从QAbstr ...

  8. Qt 学习之路:模型-视图高级技术

    PathView PathView是 QtQuick 中最强大的视图,同时也是最复杂的.PathView允许创建一种更灵活的视图.在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局.沿着同一 ...

  9. 【转】Qt之模型/视图

    [本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html   作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...

  10. QT MVC 模型/视图

    1. 模型视图实例一, QFileSystemModel  QTreeView ,model/view示例. #include <QApplication> #include <QF ...

随机推荐

  1. Slot使用

    1.组件中有单个或多个未命名slot标签时,如下:<Child><span style=”color:red;”>hello world</span></Ch ...

  2. OpenProject 分类专栏说明

    OpenProject 顾名思义 开源项目. 一.为何创建 OpenProject 专栏 主要是因为GitHub上收藏的项目越来越多,想在GitHub上查找一些收藏的内容,开始变得比较费时,为了简化搜 ...

  3. 每天学点SpringCloud(九):SpringCloud最常用配置详解

    Eureka 属性名 说明 默认值 eureka.server.enable-self-preservation 关闭注册中心的保护机制,Eureka 会统计15分钟之内心跳失败的比例低于85%将会触 ...

  4. Eclipse 启动报错 An internal error occurred during: "Initializing Java Tooling"

    如图所示,我的Eclispe版本是Oxygen,启动的时候turnaround弹出这种错误. 多种情况会导致这种报错.通过[重置窗口布局],可解决大部分情况: 解决办法:点击菜单导航栏的Window ...

  5. MyBatis 一级缓存和二级缓存及ehcache整合

    一级缓存 什么是缓存?? 缓存是存储在内存(cache)中的数据,一般情况都存在内存,在内存数据存储满了,会存储到硬盘上(disk),或是在我们进行一些操作和配置也可以把缓存存储到磁盘中. 缓存的作用 ...

  6. 使用webmagic爬虫对百度百科进行简单的爬取

    分析要爬取的网页源码: 1.打开要分析的网页,查看源代码,找到要爬取的内容: (选择网页里的一部分右击审查元素也行) 2.导入jar包,这个就直接去网上下吧: 3.写爬虫: package com.g ...

  7. 长沙IT二十年

    长沙IT二十年 古语有云“近代中国,湖南独撑半边天”,近代中国以来,多少仁人志士从湖湘这片热土出发,在中华大地上,挥毫泼墨,为中华民族的繁荣昌盛做出了不可磨灭的贡献.而今天,随着互联网时代的到来,长沙 ...

  8. 描述一下 cookies,sessionStorage 和 localStorage 的区别

    cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密),数据会在浏览器和服务器间来回传递.sessionStorage和localStorage不会自 ...

  9. yolo_v3训练自己的模型(人脸及deep-sort)

    做deep-sort多目标跟踪需要结合yolo_v3进行检测行人 由于我的项目中需要对人脸进行检测,所以需要训练针对人脸的模型 训练样本是来自WIDER-FACE人脸库.(有3w+的图片和标注框) d ...

  10. [原创]K8Cscan插件之Weblogic漏洞扫描&通用GetShell Exploit

    [原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...