# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

from PyQt4.Qt import *

from PyQt4.QtGui import *

from PyQt4.QtCore import *

import sys,os

#Qt 模型类

"""

在模型/视图中,模型提供了一个标准操作供视图和委托(view/delegate)来访问数据,由类QAbstractItemModel定义的

无论底层数据结构中数据是如何存储,类类QAbstractItemModel所有子类都将数据表示为一个包含由数据项组成表格层次型结构

图片

模型也使用信号和信号槽机制来向关联的视图通知关于数据的变化。

-----------

模型索引:

为了确保数据的表示与数据被访问的方式是分开独立的,引入了模型索引(modelindex)的概念:

可以通过每一个模型来获取信息被一个模型索引来表示,视图和委托使用模型索引来获取需要显示的数据项(视图/委托操作的不是数据项,实际上操作的是保存了数据项内容的模型索引)

模型索引包含一个指向创建它们(模型索引)的模型指针

c++写法:QAbstractItemModel *model = index.model();

模型索引提供对部分信息临时引用,通过模型获取或者修改数据,由于可能模型内部会重新组织数据结构,所以可能让模型索引出现失效情况,所以不应当保存

反之需要创建一个持久模型索引,临时模型索引由 QModelIndex类提供,持久模型索引由QPersistentModelIndex类提供。

想要获取对应的某一个数据项模型索引时,需要3个属性:行号,列号,父数据项模型索引。

行与列

一个模型可以被当作一个简单的表格来访问,通过行号和列号来定位,行号和列号的使用只是一个用来让部件之间进行通信的约定

通过向模型提供任意指定的项目行号和列号获取信息

表示该数据项的模型索引: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 = model->data(index, role);

图片:

数据项角色:最常用的用法是被Qt::ItemDataRole中定义的标准角色描述的

通过为每个角色提供适当的数据项数据,模型可以为视图和委托提供关于数据项该如何显示给用户的提示。

不同的视图可以自主选择是按照要求来忽略这个提示还是遵从这个提示。也可以定义附加的角色,以用于实现应用程序特定的目的。

"""

#---------------------------------------

"""

使用模型索引:

案例:

可以设置一个名为没有视图的:QFileSystemModel,并且在一个部件中显示文件和目录的名字。

构造一个文件系统模型:

QFileSystemModel *model = new QFileSystemModel;

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

int numRows = model->rowCount(parentIndex);

使用index()来获取一个父对象索引,使用rowCount()来统计该模型中的行数。

通过遍历来获取每一行中每一个项目的模型索引

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

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

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

// Display the text in a widget.}

保存在每个项目中的文本是使用模型的data()函数来获取的。我们指定模型索引和DisplayRole以便以字符串的形式来获取该项目的数据

从模型中获取数据时所用的基本原则:

•.一个模型的维度可以使用rowCount()和columnCount()来获取。这些函数通常要求指定一个父模型索引。

•.模型索引用来访问模型中的项目。要指定一个项目,需要行号、列号和父模型索引。

•.要访问模型中的顶级项目,需要使用QModelIndex()来指定一个空的模型索引作为父索引。

•.项目都包含针对不同角色的数据。为了获取一个指定角色的数据,必须同时向模型提供模型索引和角色。

"""

qt模型学习的更多相关文章

  1. PyQt(Python+Qt)学习随笔:QStandardItemModel指定行和列创建模型后的数据项初始化的两种方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QStandardItemModel通过构造方法 QStandardItemModel(int ro ...

  2. 第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...

  3. 第15.27节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTreeWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 树部件(Tree Widget)是Qt Designer中 Item Widgets(It ...

  4. 第15.26节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QListWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 列表部件(List Widget)对应类QListWidget,是从QListView派生 ...

  5. PyQt(Python+Qt)学习随笔:基于项的项部件(Item Widgets(Item-Based))概述

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 Model/View架构中的视图部件是基于模型的项视图(Item Views(Model-Based ...

  6. 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...

  7. 第15.24节 PyQt(Python+Qt)入门学习:Model/View架构中QTableView的作用及属性详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在Designer的部件栏Item Views中提供了PyQt和Qt已经实现好的table ...

  8. 微软CodeDom模型学习笔记(全)

    CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. ...

  9. [Django]模型学习记录篇--基础

    模型学习记录篇,仅仅自己学习时做的记录!!! 实现模型变更的三个步骤: 修改你的模型(在models.py文件中). 运行python manage.py makemigrations ,为这些修改创 ...

随机推荐

  1. IOS详解TableView——选项抽屉(天猫商品列表)

    在之前的有篇文章讲述了利用HeaderView来写类似QQ好友列表的表视图. 这里写的天猫抽屉其实也可以用该方法实现,具体到细节每个人也有所不同.这里采用的是点击cell对cell进行运动处理以展开“ ...

  2. 辛星解读mysql的用户管理

    可能做开发的多半不太关注这方面,可是要说到做运维.那就不能不关注了.由于我们都知道,root的权限太大了.不是随便能用的.我们平时最好用一些比較低的权限的用户.这样会让我们的安全性大大提高,也能防止我 ...

  3. [Angular 2] Using ng-for to repeat template elements

    This lesson covers Angular 2’s version of looping through data in your templates: ng-for. It’s conce ...

  4. String功能测试

    package foxe; import java.io.IOException;import java.util.StringTokenizer; public class MainClass { ...

  5. NSDictionary使用小结

    http://blog.csdn.net/ms2146/article/details/8656787

  6. SATA接口硬盘加密器

    加密卡置于主板与硬盘.光驱之间,透明实时地对写入数据进行加密,对读出数据进行解密,有效防止信息被窃.未经授权的阅读和修改,以及硬盘.光盘丢失.被盗.废弃.非法用户访问而引发的敏感信息泄密问题,为用户打 ...

  7. Failed to collect certificates from /data/app/vmdl201020547.tmp/base.apk: META-INF/CERT.SF indicates /data/app/vmdl201020547.tmp/base.apk is signed using APK Signature Scheme v2, but no such signature

    错误信息: 12-26 11:08:44.809 1501-1535/system_process E/PackageInstaller: Commit of session 201020547 fa ...

  8. symfony2 登录验证(转自http://www.newlifeclan.com/symfony/archives/300)

    注意:如果你需要为存储在某种数据库中的用户做一个登录表单,那么你应该考虑使用FOSUserBundle,这有助于你建立你的User对象,还为您提供了常见的登录.注册.忘记密码的路由和控制器. 在此文章 ...

  9. CSS定义网页滚动条

    (一)滚动条样式主要涉及到如下CSS属性: overflow属性: 检索或设置当对象的内容超过其指定高度及宽度时如何显示内容overflow: auto; 在需要时内容会自动添加滚动条overflow ...

  10. python中的函数存入list中的实例

    最近由于接触了python这个强大的东西,在写代码时考虑到代码的扩展性,就想到了将python的函数名存入list中.有点像习惯的c/c++中的函数指针的意思. 下面上代码: # coding=utf ...