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

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

 

在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. CentOS 5 常见的configure error的解决方法

    仅限于CentOS 5 configure: error: No curses/termcap library found 网上有的说法是: --with-named-curses-libs=/usr ...

  2. java.exe

    进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程(例:FlashGet):就是进程中一个独立的控制单元.线程在控制着进程的执行.一个进程中 ...

  3. 关于Spring Cloud的核心特性

    SOA和微服务的区别 其实服务化架构已经可以解决大部分企业的需求了,那么我们为什么要研究微服务呢?先说说它们的区别: 微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个产品,可以独立对外 ...

  4. FFmpeg开发实战(二):FFmpeg 文件操作

    FFmpeg 提供了丰富的API供我们使用,下面我们来讲述一下文件操作相关的API: FFmpeg 删除文件:avpriv_io_delete() FFmpeg 重命名文件:avpriv_io_mov ...

  5. Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型

    JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...

  6. OAuth2.0认证详解

    目录 什么是OAuth协议 OAuth2.0是为了解决什么问题? OAuth2.0成员和授权基本流程 OAuth2.0成员 OAuth2.0基本流程 什么是OAuth协议 OAuth 协议为用户资源的 ...

  7. Day2:html和css

    Day2:html和css 表格是一种常用的标签,表格结构,做到能够合并单元格. 表格的属性: 属性名 说明 border 设置表格的边框 cellspacing 设置单元格与单元格边框之间的空白间距 ...

  8. 使用Java面向对象单词必备

    第一章 class   班级,用声明类 object     目标,整个程序集对大 static  静态的 final  不可更改的,用声明常量 private  私有的,用访问权限 public  ...

  9. Kali学习笔记15:防火墙识别、负载均衡识别、WAF识别

    防火墙简单的识别方式: 如图: 可以简单明了看出:发送SYN不回应,发送ACK回RST可以说明开启过滤等等 基于这个原理,我们可以写一个脚本来对防火墙来探测和识别: #!/usr/bin/python ...

  10. 【原创】DMA

    什么是DMA     DMA,Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式.在DMA模式下,CPU只需要向DMA控制器下达指令,传输数据 ...