Qt 模型视图框架解读之模型
Qt 模型视图框架 前后阅读的好几遍,要不是项目中需要处理一些相对比较多的数据,这部分内容估计不会去急着去理解。
首先来了解下什么是模型和视图框架吧:
一般地:MVC 设计模式包括三个元素:
表示数据的模型、
表示用户界面的视图
定义了用户在界面上操作的控制器
Qt引入InterView框架,把视图和控制器部件结合在一起,使得框架更为简洁。为了灵活处理用户输入,InterView引入了代理(delegatr)。
Qt中模型、视图、代理的三者关系如下:
- 数据发生改变时,模型发出信号通知视图。
- 用户对界面进行操作,视图发出信号。
- 代理发出信号告知模型和视图编辑器目前的状态。
1、模型类
在模型、视图架构中,模型提供了一个标准的接口供视图和委托来访问数据。在Qt中,这个标准的接口使用QAbstractItemModel类来定义。
这里有三个要点:
1、无论数据项是怎样存储在何种底层数据结构中,QAbstractItemModel的子类都会以层次结构来表示数据。
2、视图按照约定来访问模型中的数据项,视图可以使用任何形式将数据显示出来。
3、当模型中的数据发生变化时,模型会通过信号和槽机制告知与其关联的视图。
三种常见的模型:列表、表格、树模型
基本概念:
1、模型索引
为了确保数据的表示与数据的获取相分离,Qt引入了模型索引的概念。视图和委托都使用索引来请求数据项并显示。
2、行和列
如果要获得一个数据项的模型索引,必须指定模型的3个属性:行号、列号、模型索引。
在最基本的形式中,一个模型可以通过把它看做一个简单的表格来访问,每个数据项可以使用行号和列号来定位。
3、父项
在获取数据项的索引时,父项的模型索引可以用QModelIndex()表示。
4、项角色
模型中的数据项可以作为各种角色在其他组件中访问,允许不同的情况提供不同类型的数据。
这些概念一开始接触非常不好理解《QtCreator 快速入门》一书中有实例可以帮助理解:
实例的效果:
实例中是一个简单的树状显示
接着看下代码
#include <QApplication>
#include <QTreeView>
#include <QDebug>
#include <QStandardItemModel>int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建标准项模型QStandardItemModel model;// 获取模型的根项(Root Item),根项是不可见的QStandardItem *parentItem = model.invisibleRootItem();// 创建标准项item0,并设置显示文本,图标和工具提示QStandardItem *item0 = new QStandardItem;item0->setText("A");QPixmap pixmap0(50,50);pixmap0.fill("red");item0->setIcon(QIcon(pixmap0));item0->setToolTip("indexA");// 将创建的标准项作为根项的子项parentItem->appendRow(item0);// 将创建的标准项作为新的父项parentItem = item0;// 创建新的标准项,它将作为item0的子项QStandardItem *item1 = new QStandardItem;item1->setText("B");QPixmap pixmap1(50,50);pixmap1.fill("blue");item1->setIcon(QIcon(pixmap1));item1->setToolTip("indexB");parentItem->appendRow(item1);// 创建新的标准项,这里使用了另一种方法来设置文本、图标和工具提示QStandardItem *item2 = new QStandardItem;QPixmap pixmap2(50,50);pixmap2.fill("green");item2->setData("C", Qt::EditRole);item2->setData("indexC", Qt::ToolTipRole);item2->setData(QIcon(pixmap2), Qt::DecorationRole);parentItem->appendRow(item2);// 在树视图中显示模型QTreeView view;view.setModel(&model);view.show();// 获取item0的索引并输出item0的子项数目,然后输出了item1的显示文本和工具提示QModelIndex indexA = model.index(0, 0, QModelIndex());qDebug() << "indexA row count: " << model.rowCount(indexA);QModelIndex indexB = model.index(0, 0, indexA);qDebug() << "indexB text: " << model.data(indexB, Qt::EditRole).toString();qDebug() << "indexB toolTip: " << model.data(indexB, Qt::ToolTipRole).toString();return app.exec();
}
代码的注释很明确:这里用标准模型项类实现的三个项,然后用树状视图显示,并且通过模型索引来访问数据项。
这里我们注释
// parentItem = item0;
并且添加QTableView视图;
QTableView viewtable;
viewtable.setModel(&model);
viewtable.show();
重新构建
这时候弹出两个视图:
到这里,关于父项,行、列、索引、项目角色这些概念应该可以搞清楚了。
Qt 模型视图框架解读之模型相关推荐
- Qt 模式视图框架解读之委托
3.委托类 Qt中的模型.视图结构中没有包含一个完全分离的组件来处理与用户的交互. 一般地.视图用来将模型中的数据展示给用户,也用来处理用户的输入.为了获得更高的灵活性,交互可以交给委托来执行. 控制 ...
- Qt 图形视图框架(Qt MVC)
什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离 ...
- Qt 图形视图框架中的事件处理和传播
目录名字 Qt 图形视图框架中的事件处理和传播 要点: Qt 图形视图框架中的事件处理和传播 图形视图框架在一些动画类的应用程序上经常会用到.该框架中的事件处理与传播机制也是经常会涉及. 程序设计核心 ...
- Qt图形视图框架详解-安晓辉-专题视频课程
Qt图形视图框架详解-12227人已学习 课程介绍 介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...
- Qt图形视图框架图片图元QGraphicsPixmapItem
文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/107.html 看这个标题还真有点拗口,一句话里出现了四个图字.这句话的关键词是图片,前面讲了 ...
- Qt图形视图框架:QGraphicsScene详解
一.描述 1.场景提供了一个用于管理大量2D图形项的平面.该类充当图形项的容器. 它与视图一起用于可视化2D曲面上的图形图形项. 2.场景没有自己的视觉外观,只负责管理图形项. 3.场景的最大优势之一 ...
- 201112阶段二qt图形视图框架
目录 一.学习的知识点 一)事件 二)图形视图框架 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 一)事件 鼠标事件的创建 组合键 二)图形视图框架 场景类:坐标系以中心为 ...
- Qt模型视图框架:QListView
一.描述 QListView 将存储在模型中的项目呈现为简单的非分层列表或图标集合.此视图不显示水平或垂直标题. QStandardItemModel * model = new QStandardI ...
- Qt图形视图框架:视图增加标尺
效果: 把视图.水平标尺.垂直标尺用网格布局放置. 每当拖动视图的滚动条时,更新标尺的偏移量: connect(deviceGraphicsView->horizontalScrollBar() ...
最新文章
- java 中的内部类介绍
- VMware使用方法
- 怎样在Web开发中完美控制IE标题栏
- 微信小程序自定义状态栏
- Java连接数据库(JDBC)之三:java访问数据库MySQL实例
- 关于VS环境下制作和使用静态库和动态库
- 什么是bean的生命周期?
- ControllerShutdownRequest分析
- postgresql 集合类型_PostgreSQL 分组集合新功能(GROUPING SETS,CUBE,ROLLUP)
- 艾伟:WinForm控件开发总结(三)------认识WinForm控件常用的Attribute
- 基于PHP+MySQL游戏商城销售网站的设计与实现
- 安装配置fcitx输入法
- JAVA数据库宾馆住宿系统_java+数据库 宾馆客房管理系统
- 关于sip软电话嵌入到网页web端的学习----第一天(1)(高手指点)
- 莫队算法+带修莫队+回滚莫队
- Markdown 中的flow语法 flowchart.js 的基础教程
- 【中文树库标记---CTB】
- App避免被杀死,常驻后台
- window.frames用法
- 计算机没有打字键盘显示不出来,键盘打不出字怎么回事
热门文章
- 函数名称前面加引用“”或指针符号“*”的意思
- Linux C++多线程同步的四种方式
- php html采集,php file_get_contents函数轻松采集html数据
- leetcode_longest substring without repeating characters
- [云炬创业管理笔记]第三章测试5
- FIR数字滤波器设计频率抽样法MATLAB仿真
- PowerDesigner16中的对象无效,不允许有扩展属性 问题的解决
- delphi virtual dynamic
- SQL Server 2005 常用数据类型详解
- Linxu嵌入式汇编语言