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 ...
随机推荐
- Slot使用
1.组件中有单个或多个未命名slot标签时,如下:<Child><span style=”color:red;”>hello world</span></Ch ...
- OpenProject 分类专栏说明
OpenProject 顾名思义 开源项目. 一.为何创建 OpenProject 专栏 主要是因为GitHub上收藏的项目越来越多,想在GitHub上查找一些收藏的内容,开始变得比较费时,为了简化搜 ...
- 每天学点SpringCloud(九):SpringCloud最常用配置详解
Eureka 属性名 说明 默认值 eureka.server.enable-self-preservation 关闭注册中心的保护机制,Eureka 会统计15分钟之内心跳失败的比例低于85%将会触 ...
- Eclipse 启动报错 An internal error occurred during: "Initializing Java Tooling"
如图所示,我的Eclispe版本是Oxygen,启动的时候turnaround弹出这种错误. 多种情况会导致这种报错.通过[重置窗口布局],可解决大部分情况: 解决办法:点击菜单导航栏的Window ...
- MyBatis 一级缓存和二级缓存及ehcache整合
一级缓存 什么是缓存?? 缓存是存储在内存(cache)中的数据,一般情况都存在内存,在内存数据存储满了,会存储到硬盘上(disk),或是在我们进行一些操作和配置也可以把缓存存储到磁盘中. 缓存的作用 ...
- 使用webmagic爬虫对百度百科进行简单的爬取
分析要爬取的网页源码: 1.打开要分析的网页,查看源代码,找到要爬取的内容: (选择网页里的一部分右击审查元素也行) 2.导入jar包,这个就直接去网上下吧: 3.写爬虫: package com.g ...
- 长沙IT二十年
长沙IT二十年 古语有云“近代中国,湖南独撑半边天”,近代中国以来,多少仁人志士从湖湘这片热土出发,在中华大地上,挥毫泼墨,为中华民族的繁荣昌盛做出了不可磨灭的贡献.而今天,随着互联网时代的到来,长沙 ...
- 描述一下 cookies,sessionStorage 和 localStorage 的区别
cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密),数据会在浏览器和服务器间来回传递.sessionStorage和localStorage不会自 ...
- yolo_v3训练自己的模型(人脸及deep-sort)
做deep-sort多目标跟踪需要结合yolo_v3进行检测行人 由于我的项目中需要对人脸进行检测,所以需要训练针对人脸的模型 训练样本是来自WIDER-FACE人脸库.(有3w+的图片和标注框) d ...
- [原创]K8Cscan插件之Weblogic漏洞扫描&通用GetShell Exploit
[原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...