qt4MV编程:3 模式类

 
模式类
 
本节结构
       基本概念
              模式索引
              行和列
              条目的前继
              条目的角色
              概念小结
              使用模式索引
       深入阅读
 
基本概念
       在Model/View体系结构中,模式为视图和代理提供了访问数据的统一接口。在QT中,标准接口由QAbastractItemModel类定义。虽然数据条目在底层数据结构中的存储方式不同,但是所有的QAbstractItemModel子类所呈现的数据接口,都是包含表格条目的继承结构。视图使用这些方便的接口来访问模式中的数据条目,但是视图不是和它们呈现给用户信息那样严格。

模式也通过信号和槽机制通知视图数据发生了改变。
       本节描述一些基本概念,这些概念是其他组件通过模式类访问数据的方式的核心。更高级的概念将在以后的章节中描述。
 
模式索引
       为了保证数据的显示和访问的方式相分离,引入模式索引的概念。通过模式获得的任何信息都是由模式索引访问的。视图和代理使用这些索引来请求数据条目并显示。
       这样,只有模式需要知道怎样去获取数据,并且模式管理的数据类型,可以很通用的定义。模式索引由模式创建,并且包含一个指向创建它的模式的指针,这样可以防止在多个模式的时候产生混淆。

QAbstractItemModel * model = index.model();

 
模式索引提供了一个对信息片的临时引用,可以别用来通过模式访问或修改数据。随着程序的运行,模式会重新组织它内部的结构,所以,模式索引可能会变成无效,因而不需要保存。如果需要一个长时间的对信息片的引用,就必须创建一个持续的模式索引。它提供了更新中的模式的信息的索引。临时模式索引由类 QModelIndex 提供,而持续模式索引由类 QPersistentModelIndex 提供。
       要获取相应数据条目的模式索引,必须向模式说明三个属性:行号,列号和条目的父条目。下面详细描述这些属性。
 
行和列
       最基本的形式,模式可以被当成一个简单表格来访问,条目都是根据它的行和列来存放的。这并不是说,底层的数据是按照数组来存储的;行号和列号的使用只是为了组件之间通讯的方便。我们可以访问一个模式的任意给定的行号和列号的条目信息,并且我们可以找到代表该条目的索引:

QModelIndex index = model->index( row,column,… );

模是为像列表和表格这样的简单单一层次的数据结构提供接口,不需要提供其他的信息,但是,像上面的代码所示,我们需要提供更多的信息来获取一个模式索引。

行和列
左图是一个基本表模式的示意图,每个条目由一对行号和列号存储。向模式提供相应的行号和列号我们就可以获取数据条目的模式索引。

QModelIndex indexA = model->index(0,0,QModelIndex() );

QModelIndex indexB = model->index(1,1,QModelIndex() );

QModelIndex indexC = model->index(2,1,QModelIndex() );

模式中的顶层条目通常由QModelIndex()来说明,作为它们的父条目。在下节中将讨论。
 
父条目
当在表格或者列表视图中使用数据时,模式提供的表格式的数据条目接口是非常理想的,行号和列号系统完全映射到条目显示的方式。然而,像树形视图这样的结构需要模式在内部提供更灵活的接口。因此,每个条目也是另一个条目表格的父条目,同样的,树形视图的顶层条目可以包含另一列条目。
       当需要一个模式条目的索引时,我们必须提供该条目的父条目的信息。模式外部,定位一个条目的唯一方法就是使用模式索引,同样父模式索引也必须给出:

QModelIndex index = model->index( row, column, parent );

父条目,行和列
左图示意了一个树形模式,其中,每个条目由父条目,行号和列号来访问。
条目“A”和“C”在模式中是同属顶层条目:

QModelIndex indexA = model->index(0, 0, QModelIndex());

 QModelIndex indexC = model->index(2, 1, QModelIndex());

“A”条目有一些子条目。条目“B”的模式索引就这样获取:

QModelIndex indexB = model->index(1, 0, indexA);

 
条目角色
模式中的条目对于其他组件可以表现出不同的角色,对不通的情况可以提供不同类型的数据。例如,QT::DisplayRole角色用于访问一个字符串,可以在视图中当作文本显示。一般典型的,条目包含各种角色的数据,标准的角色由QT::ItemDataRole定义。
       我们通过传递相应模式索引和说明需要取得的数据类型,向模式取得数据条目:

QVariant value = mode->data( index, role );

条目角色
角色向模式说明需要获取的是哪类数据。视图可以以不同的方式显示角色,所以提供每个角色适合的信息是非常重要的。
章节“创建新的模式”更详细地覆盖介绍了角色的一些特殊用法
数据条目的大部分使用都可以用标准角色定义Qt::ItemDataRole. 通过提供每种角色相应的数据条目,模式可以告诉视图和代理条目应该怎样呈现给用户。不同类型的视图可以根据要求解释或忽略这些信息。同样,为了特殊的目的,可以增加角色的定义。
 
概念小结
模式提供的模式索引为视图和代理提供条目位置信息,而不依赖于底层数据结构。
条目有它们的行号和列号以及它们的父条目。
应其他组件的需求,如视图和代理,模式创建了模式索引。
如果通过使用模式索引请求index()创建了父条目的索引,返回该模式中父条目下的条目。获得的索引是该条目的子条目。
角色区分条目的不同类型数据。
 
使用模式索引
为了演示怎样从模式中访问数据,使用模式索引,我们设置QDirModel而不用视图,使用一个widget来显示文件和文件夹的名称。这个例子没有显示使用模式的一般方式,但是它显示了使用模式索引的方便性。
       我们如下创建一个目录模式

       QDirModel * model = new QDirModel;

       QModelIndex parentIndex = model->index( QDir::currentPath() );

       int numRows = model->rowCount( parentIndex );

       在例子中,我们配置了一个默认的QDirModel,包含一个特殊实现index()的父索引,然后使用函数rowCount()来获取行数。
       为了简单,我们只考虑模式中的第一列的条目。我们依次解释没行,获取没行的第一个条目的索引,读取模式中条目的数据。

       for( int row = 0; row < numRows; ++row )

       {

              QModelIndex index = model->index( row, 0, parentIndex );

       我们说明行号、列号(第一列为0)和所有我们想要的条目的父条目的索引,这样我们获得模式索引。存储在每个条目中的文本可以通过模式的函数data()获取。我们指明模式索引和DispalyRole角色,来获取字符串格式的条目数据。

       QString text = model->data( index,Qt::DisplayRole).toString();

       // Display the text in a widget.

}
上面的例子说明了从模式中获取数据的基本原理:
       模式的规模可以通过函数rowCount()和columnCount()获取。这些函数需要提供一个父索引为参数
       在例子中使用模式索引来存取条目。行、列和父模式索引用于说明条目。
       最上层模式条目,使用一个空模式索引QModelIndex()来说明。
       条目包含不同角色的数据。要获得特殊角色的数据,必须向模式提供模式索引和角色。
 
深入阅读
       实现QAbstractItemModel的标准接口,就可以创建新的模式。在“创建新的模式”章节中,我们将演示创建一个保存字符串列表的准使用模式。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值