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 ...
随机推荐
- Postgresql 数据库错误修复v0.1
PS. 查询\nebula_boh\logs\BOHInterfaceLog.log 日志, 一般数据库文件损坏的日志 有 “UncategorizedSQLException” 或 “zero pa ...
- Servlet发送邮件遇到的问题SMTPSendFailedException 554
接到通知,一个接收用户请求的邮箱有段时间收不到邮件了.当时想着这么简单的功能,就没有加上日志记录.重写程序后,日志记下的报错是:SMTP的SMTPSendFailedException 554 co ...
- Koa 学习笔记
开始 就像官网上说的,一切框架都从一个"Hello World"开始,首先我们新建一个 package.json,内容尽量简单: { "name": " ...
- 关于oracle数据库的小知识
--查询语句:select 列名/通配符/列别名/表达式 from 表名 (修饰/限制语句)select * from tab;select tname from tab;--指定的列select t ...
- MapReduce实例学习
https://blog.csdn.net/m0_37739193/article/details/77676859
- WebView的知识
一.基本介绍 WebView是一个显示页面的组件. 二.基本使用 访问网页需要网络,所以在AndroidManifest.xml文件中添加网络权限. <uses-permission andro ...
- 终端(命令行)连接MySQL
语法: mysql -h 主机名(ip) -u 用户名 -P 端口 -p 说明: -h: 主机名,表示要连接的数据库的主机名或者IP -u: 用户名,表示连接数据库的用户名 -P: 端口,表示要连接的 ...
- Kali学习笔记38:文件上传漏洞
早些年,提到Web渗透,或者搜索一些黑客教程 基本都会看到文件上传漏洞. 它是一个很经典的漏洞 但它本质其实不是一个漏洞,而是网站本身的上传文件功能 不过如果我们上传了Webshell,那么就成为了文 ...
- 在Ubuntu 18.04中安装pyenv(Python多版本管理工具)
最近正在重头梳理Python的基础知识,为了更好地使用Python进行开发,防止发生版本混乱(不同的第三方库有可能因为Python版本不兼容而报错),所以需要使用pyenv进行版本管理. *** 通常 ...
- 从零开始学 Web 之 Vue.js(六)Vue的组件
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...