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 模型视图框架解读之模型相关推荐

  1. Qt 模式视图框架解读之委托

    3.委托类 Qt中的模型.视图结构中没有包含一个完全分离的组件来处理与用户的交互. 一般地.视图用来将模型中的数据展示给用户,也用来处理用户的输入.为了获得更高的灵活性,交互可以交给委托来执行. 控制 ...

  2. Qt 图形视图框架(Qt MVC)

    什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离 ...

  3. Qt 图形视图框架中的事件处理和传播

    目录名字 Qt 图形视图框架中的事件处理和传播 要点: Qt 图形视图框架中的事件处理和传播 图形视图框架在一些动画类的应用程序上经常会用到.该框架中的事件处理与传播机制也是经常会涉及. 程序设计核心 ...

  4. Qt图形视图框架详解-安晓辉-专题视频课程

    Qt图形视图框架详解-12227人已学习 课程介绍         介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...

  5. Qt图形视图框架图片图元QGraphicsPixmapItem

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/107.html 看这个标题还真有点拗口,一句话里出现了四个图字.这句话的关键词是图片,前面讲了 ...

  6. Qt图形视图框架:QGraphicsScene详解

    一.描述 1.场景提供了一个用于管理大量2D图形项的平面.该类充当图形项的容器. 它与视图一起用于可视化2D曲面上的图形图形项. 2.场景没有自己的视觉外观,只负责管理图形项. 3.场景的最大优势之一 ...

  7. 201112阶段二qt图形视图框架

    目录 一.学习的知识点 一)事件 二)图形视图框架 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 一)事件 鼠标事件的创建 组合键 二)图形视图框架 场景类:坐标系以中心为 ...

  8. Qt模型视图框架:QListView

    一.描述 QListView 将存储在模型中的项目呈现为简单的非分层列表或图标集合.此视图不显示水平或垂直标题. QStandardItemModel * model = new QStandardI ...

  9. Qt图形视图框架:视图增加标尺

    效果: 把视图.水平标尺.垂直标尺用网格布局放置. 每当拖动视图的滚动条时,更新标尺的偏移量: connect(deviceGraphicsView->horizontalScrollBar() ...

最新文章

  1. java 中的内部类介绍
  2. VMware使用方法
  3. 怎样在Web开发中完美控制IE标题栏
  4. 微信小程序自定义状态栏
  5. Java连接数据库(JDBC)之三:java访问数据库MySQL实例
  6. 关于VS环境下制作和使用静态库和动态库
  7. 什么是bean的生命周期?
  8. ControllerShutdownRequest分析
  9. postgresql 集合类型_PostgreSQL 分组集合新功能(GROUPING SETS,CUBE,ROLLUP)
  10. 艾伟:WinForm控件开发总结(三)------认识WinForm控件常用的Attribute
  11. 基于PHP+MySQL游戏商城销售网站的设计与实现
  12. 安装配置fcitx输入法
  13. JAVA数据库宾馆住宿系统_java+数据库 宾馆客房管理系统
  14. 关于sip软电话嵌入到网页web端的学习----第一天(1)(高手指点)
  15. 莫队算法+带修莫队+回滚莫队
  16. Markdown 中的flow语法 flowchart.js 的基础教程
  17. 【中文树库标记---CTB】
  18. App避免被杀死,常驻后台
  19. window.frames用法
  20. 计算机没有打字键盘显示不出来,键盘打不出字怎么回事

热门文章

  1. 函数名称前面加引用“”或指针符号“*”的意思
  2. Linux C++多线程同步的四种方式
  3. php html采集,php file_get_contents函数轻松采集html数据
  4. leetcode_longest substring without repeating characters
  5. [云炬创业管理笔记]第三章测试5
  6. FIR数字滤波器设计频率抽样法MATLAB仿真
  7. PowerDesigner16中的对象无效,不允许有扩展属性 问题的解决
  8. delphi virtual dynamic
  9. SQL Server 2005 常用数据类型详解
  10. Linxu嵌入式汇编语言