25.QT-模型视图
模型视图设计模式的核心思想
- 使模型(数据)与视图(显示)相分离
- 模型只需要对外提供标准接口存取数据,无需数据如何显示
- 视图只需要自定义数据的显示方式,无需数据如何组织存储
- 当数据发生改变时,会通过信号通知视图
- 当用户与视图进行交互时,会通过信号向模型发送交互信息
在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-模型视图的更多相关文章
- Qt模型/视图、委托
MVC视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了数据与呈现给用户的方式,使得它可以在几个不同的视图中显示相同的数据,并实现新类型的视图而无需改变底层的数据结构.为了灵活的处理数据输入, ...
- Qt 模型/视图/委托
模型.视图.委托 模型/视图架构基于MVC设计模式发展而来.MVC中,模型(Model)用来表示数据:视图(View)是界面,用来显示数据:控制(Controller)定义界面对用户输入的反应方式. ...
- 38.Qt模型/视图结构
1.模型/视图类 2.模型 3.视图 4.代理 1 模型/视图类 InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringL ...
- Qt 模型/视图结构
MVC是一种与用户界面相关的设计模式.通过使用此模型,可以有效地分离数据和用户界面.MVC设计模式包含三要素:表示数据的模型(Model).表示用户界面的视图(View)和定义了用户在界面上的操作控制 ...
- Qt模型/视图框架----简单的例子
#include<qapplication.h> #include<qfilesystemmodel.h> #include<qtreeview.h> #inclu ...
- Qt模型视图结构遇见的小问题
在本文的最开始,我们来看两个帮助文档内容: selectionMode : SelectionMode This property holds which selection mode the vie ...
- Qt之模型/视图(自定义进度条)
简述 在之前的章节中分享过关于QHeaderView表头排序.添加复选框等内容,相信大家模型/视图.自定义风格有了一定的了解,下面我们来分享一个更常用的内容-自定义进度条. 实现方式: 从QAbstr ...
- Qt 学习之路:模型-视图高级技术
PathView PathView是 QtQuick 中最强大的视图,同时也是最复杂的.PathView允许创建一种更灵活的视图.在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局.沿着同一 ...
- 【转】Qt之模型/视图
[本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html 作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...
- QT MVC 模型/视图
1. 模型视图实例一, QFileSystemModel QTreeView ,model/view示例. #include <QApplication> #include <QF ...
随机推荐
- CentOS 5 常见的configure error的解决方法
仅限于CentOS 5 configure: error: No curses/termcap library found 网上有的说法是: --with-named-curses-libs=/usr ...
- java.exe
进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程(例:FlashGet):就是进程中一个独立的控制单元.线程在控制着进程的执行.一个进程中 ...
- 关于Spring Cloud的核心特性
SOA和微服务的区别 其实服务化架构已经可以解决大部分企业的需求了,那么我们为什么要研究微服务呢?先说说它们的区别: 微服务架构强调业务系统需要彻底的组件化和服务化,一个组件就是一个产品,可以独立对外 ...
- FFmpeg开发实战(二):FFmpeg 文件操作
FFmpeg 提供了丰富的API供我们使用,下面我们来讲述一下文件操作相关的API: FFmpeg 删除文件:avpriv_io_delete() FFmpeg 重命名文件:avpriv_io_mov ...
- Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型
JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...
- OAuth2.0认证详解
目录 什么是OAuth协议 OAuth2.0是为了解决什么问题? OAuth2.0成员和授权基本流程 OAuth2.0成员 OAuth2.0基本流程 什么是OAuth协议 OAuth 协议为用户资源的 ...
- Day2:html和css
Day2:html和css 表格是一种常用的标签,表格结构,做到能够合并单元格. 表格的属性: 属性名 说明 border 设置表格的边框 cellspacing 设置单元格与单元格边框之间的空白间距 ...
- 使用Java面向对象单词必备
第一章 class 班级,用声明类 object 目标,整个程序集对大 static 静态的 final 不可更改的,用声明常量 private 私有的,用访问权限 public ...
- Kali学习笔记15:防火墙识别、负载均衡识别、WAF识别
防火墙简单的识别方式: 如图: 可以简单明了看出:发送SYN不回应,发送ACK回RST可以说明开启过滤等等 基于这个原理,我们可以写一个脚本来对防火墙来探测和识别: #!/usr/bin/python ...
- 【原创】DMA
什么是DMA DMA,Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式.在DMA模式下,CPU只需要向DMA控制器下达指令,传输数据 ...