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 区分数据

6.Model类的更多相关文章

  1. iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

    在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property ...

  2. iOS开发之使用Runtime给Model类赋值

    本篇博客算是给网络缓存打个基础吧,本篇博客先给出简单也是最容易使用的把字典转成实体类的方法,然后在给出如何使用Runtime来给Model实体类赋值.本篇博客会介绍一部分,主要是字典的key与Mode ...

  3. 构建自己的PHP框架--实现Model类(3)

    在之前的博客中,我们实现并完善了Model类的findOne方法,下面我们来实现其中的其他方法. 先来看findAll方法,这个方法和findOne很相似. public static functio ...

  4. 构建自己的PHP框架--实现Model类(1)

    在之前的博客中,我们定义了ORM的接口,以及决定了使用PDO去实现.最后我们提到会有一个Model类实现ModelInterface接口. 现在我们来实现这个接口,如下: <?php names ...

  5. tp框架之Model类与命名空间

    1.获取系统常量信息 public function shuchu() { var_dump(get_defined_constants()); } 2.跨控制器或跨模块调用 function dia ...

  6. 为测试框架model类自动生成xml结果集

    问题:有大量类似于theProductId这样名字的字符串需要转换成the_product_id这种数据库column名的形式. 思路:见到(见)大写字母(缝)就插入(插)一个“_”字符(针)进去,最 ...

  7. C# 类型转换 Dictionary转Model类

    /// <summary> /// 把Model转换为DataRow /// </summary> /// <typeparam name="T"&g ...

  8. iOS开发——model类模板(过滤null和ID)

            说明:model类模板已默认过滤null值,附加特殊情况的关键字ID名的冲突(需手动去掉注释代码).MyMessageModel为示例的名字.可以自己随便起. 1.自己创建一个继承与N ...

  9. (转)Qt Model/View 学习笔记 (三)——Model类

    Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...

  10. PureMVC(JS版)源码解析(十一):Model类

          这篇博文讲PureMVC三个核心类——Model类.Model类的构造函数及工厂函数[即getInstance()方法]和View类.Controller类是一样的,这里就不重复讲解了,只 ...

随机推荐

  1. eclipse 环境 JUnit 测试框架(junit.framework.* 与 org.junit.*)

    如下所示,先通过 build path 导入 junit 环境依赖的 jar 包: 1. junit.framework.* junit.framework.* 主要类和函数: Test TestCa ...

  2. 转载:电商项目完成的BUG调查原因和解决方案

    转载: http://blog.csdn.net/yuexianchang/article/details/73197874

  3. 2017-2018-1 20179215《Linux内核原理与分析》第十二周作业

    Sql注入基础原理介绍 分组:和20179205王雅哲共同完成实验 一.实验说明 1.1 sql注入  SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组 ...

  4. linux大于2T的磁盘格式化

    fdisk默认只能格式小于2T的磁盘,我们经常会碰到大于2T的磁盘,我们不能fdisk 格式化. 我们得用parted 来的格式化 parted 命令可能没有,yum install -y parte ...

  5. 常用Request对象获取请求信息

    Request.ServerVariables(“REMOTE_ADDR”) ‘获取访问IPRequest.ServerVariables(“LOCAL_ADDR”) ‘同上Request.Serve ...

  6. [转]【技术心得】Last-Modified,Etag,Expire区别

    Last-Modified 是什么 Last-Modified 是 HttpHeader 中的资源的最后修改时间,如果带有 Last-Modified ,下一次发送 Http 请求时,将会发生带 If ...

  7. hdu 3932 Groundhog Build Home——模拟退火

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3932 注意平均值与最远的点距离为0的情况.所以初值设成-1,这样 id 就不会乱.不过设成0也可以.注意判 ...

  8. VS2013 中使用 CxImage 库时用Unicode编码时出现链接错误

    CxImage 本身是支持Unicode 编码的,编译CxImage库的时候选择编译Unicode就可以了,得到的lib文件和dll文件很容易看出有个u的就是Unicode编码的 当然在使用的时候要对 ...

  9. web打印详解

    在B/S模式开发中,打印是个很大的困扰.无论是采用页面直接输出或者引用WORD.DLL也好,都有不足之处. 目前最好的办法就是采用第三方控件,网上流传的打印控件有很多.总结了下推荐几个给大家: 一.首 ...

  10. “makefile”写法详解,一步一步写一个实用的makefile,详解 sed 's,$∗\.o[ :]*,\1.o $@ : ,g' < $@.

    目的:编写一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译.并且当某个.c/.cpp..h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译. 二要 ...