Basic Concepts
     在Model/View结构中,Model提供标准的接口让View和Delegate获得数据。在QT中,标准的接口都被定义在QAbstractItemModel类中。不论数据如何存储在底层的数据结构中,任何QAbstractItemModel的子类,将数据表示为表或者树等层次结构。
     View很方便的获得Model中的Item Data,但是这些数据显示给用户时候,并不需要严格的以表或者树等形式显示。
 
    
  
 
  Model也告知那些关联的View数据改变,通过信号和槽机制。
  本章介绍基础概念: 其他组件如何通过Model类获取到 Item Data的?
 
 
Model Index
     为了数据的呈现和数据的访问方式保持独立,引入了Model Index概念。通过Model获得任何一条信息,都由Model Index表示。View和Delegate使用Index获得数据,然后显示出来。
     其结果是,只有Model类知道需要如何得到数据,Model类所处理的数据类型也可以被定义的相当普遍。Model Index包含一个指向Model(创建Model Index的Model)的指针,这个指针避免了使用多个Model时产生混乱。
 
     QAbstractItemModel *model = index.model();
 
     由于Model可能会时不时的重组内部结构,此时Model Index变无效,也没有必要保存。如果要长期的保存对某数据的引用,Persistent Model Index 将被创建,它提供了Model中数据的最新信息。临时的Model Index由QModelIndex类创建,持续的Model Index由QPersistentModelIndex创建。
     
     为了获得与Model Index相对应的数据,Model中三个属性必须具体指定: Row、Column、Model Index of a parent item。
 
 
Rows and Columns
   在最基本的形式,一个Model可以作为一个表被访问,这个表指定了行数和列数。这不意味底层的数据也被存储在类似表的数据结构中。Model以表格形式,只是为了组件之间的通讯更方便。给定行和列,我们能得到指定的Item Date,也能得到这个Item Date的Model Index。
 
     QModelIndex QAbstractItemModel::index(int  row, int column, QModelIndex &parent = QModelIndex()  ) const [ pure virtual]
        
 
  QModelIndex indexA = model->index(0, 0, QModelIndex() );
  QModelIndex indexB = model->index(1, 1, QModelIndex() );
  QModelIndex indexC = model->index(2, 1, QModelIndex() );
  为什么总把QModelIndex()作为父类的引用,将在下一节讨论。
 
Parent of Items
   在Table或者List Model中数据和数据将在View中显示的位置完全一致,这是一种理想状态。但是在Tree Model中,需要更灵活的接口。因此顶级的Model Index能作为下面的Model Index 父类。如下图所示:
         
      
 
     QModelIndex indexA = modex->index(0, 0, QModexIndex() );
     QModelIndex indexC = modex->index(2, 1, QModexIndex() );
     查看Qt文档。QModexIndex::QModexIndex() 构造函数创建一个空的ModelIndex,因为A和C都是Top-level,所以可以认为父类的QModexIndex为空
     而对于B来说 QModelIndex indexB = modex->index(1, 0, indexA ); 父类的ModelIndex就是indexA
 
Item Roles
    
     在Model中的数据以不同的角色划分,例如Qt::DisplayRole就是获得字符串,然后在View中显示出来。其他的角色详见Qt::ItemDataRole。
     我们能够根据Model Index和Role获得我们想要的类型的数据。
     QVariant value = model->data(index, role);
 
总结:
1.ModelIndex提供给View和Delegata 数据信息。Model是List、Table、Tree形式,和底层的数据存储在哪里,如何存储无关。
2.获得ModelIndex 需要3个参数,Row,Column,Parent Modex Index of Item。
3.Model根据其他组件(例如:View Delegate)的需求,创建ModelIndex。
4.Top-level ModelIndex : model->index(row, column, QModelIndex() )
5.子ModelIndex : model->index(row, column, indexParent )
6.Qt::ItemDataRole 区分数据

最新文章

  1. 【夯实Nginx基础】Nginx工作原理和优化、漏洞
  2. TCP三次握手/四次挥手详解
  3. jsp与数据库的连接
  4. 51Nod 1001 数组中和等于K的数对 Label:Water
  5. JavaWeb学习记录(二十二)——模式字符串与占位符
  6. EF6 在原有数据库中使用 CodeFirst 总复习(二、新的需求,简单修改原有表)
  7. FFmpeg解码H264及swscale缩放详解
  8. 高精度+搜索+质数 BZOJ1225 [HNOI2001] 求正整数
  9. StrictMode模式介绍
  10. jQuery.attributes源码分析(attr/prop/val/class)
  11. Gap year | 最好金龟换酒
  12. 安装arcgis server完成,打开出现未关联错误怎么办
  13. Java钉钉开发_01_开发前的准备
  14. [js高手之路]html5 canvas动画教程 - 跟着鼠标移动消失的一堆炫彩小球
  15. 谈谈JavaScript中继承方式
  16. html中的列表
  17. urllib、urllib2、urllib3区别和使用
  18. 【Android】Android 监听apk安装替换卸载广播
  19. BZOJ2670 : Almost
  20. C语言基础课第二次作业

热门文章

  1. python使用 db.select 返回的数据只能遍历一次
  2. PHP提供的数组比较函数总结
  3. 设置nodepad++的编码问题
  4. 基于Python语言使用RabbitMQ消息队列(三)
  5. css3 flex布局/grid布局
  6. CentOS6.5 下MySQL傻瓜式安装
  7. boost1_55_0编译和安装
  8. 在Azure上搭建L2TP服务器
  9. Java基础--虚拟机JVM
  10. WCF svcutil工具