qt模型学习

# -*- 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模型学习

时间: 2024-10-06 03:24:42

qt模型学习的相关文章

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

要点1 CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. 注意:在 .NET Framework 2.0版中,在代码生成器和代码编译器中可用的方法可直接从代码提供程序获得.您不需要调用CreateGenerator 或CreateCompiler 来访问这些方法,这些方法被标记为已过时.这适用于预先存在的以及新的代码提供程序实现. CodeDomP

DOM事件模型学习笔记

下面的内容属于阅读笔记,其中涉及大量内容来自于PPK的博客的内容,如果你要跟随我的脚步领略大家风采,那么就从Introduction to Events开始阅读吧. 现代的前端开发应该是会严格遵守 html 展示文档内容构成,css 渲染页面效果,javascript 提供交互 浏览器提供交互行为可以追溯到Netscape公司在其第二个版本中支持javascript语言,随后其与微软之间的浏览器大战,以及w3c标准制定的落后,导致至今一直被诟病的浏览器兼容问题,而这些不兼容中关于DOM事件模型的

Qt多线程学习:创建多线程

[为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题能够用事件处理和多线程来解决. [Linux有线程的概念吗?] 传统的UNIX系统也支持线程的概念,但一个进程里仅仅同意有一个线程,这样多线程就是多进程.Linux下的Posix线程(pthreads)是一种轻量级的进程的移植性实现,线程的调度由内核完毕,每一个线程都有自己的编号.假设使用线程,整体

【点击模型学习笔记】A survey on click modeling in web search_Lianghao Li_ppt

是一篇综述性质的ppt. 主要内容: 对搜索中的广告点击预测,总结学术界的研究成果. 搜索广告主要展示位为:1. 搜索结果页面最上侧:2. 搜索结果右侧. 研究意义:广告点击次数直接影响收入 问题抽象:对于某个query q,和某个广告ad,预测用户对它们的点击率. 具体内容: 1. 最简单的点击模型:通过点击次数来预测,计算公式为 P = #count of clicks / #count of impressions(展现) 缺点:点击受到用户浏览行为的影响:对于长尾query和ad,存在冷

概率图模型学习笔记(二)贝叶斯网络-语义学与因子分解

概率分布(Distributions) 如图1所示,这是最简单的联合分布案例,姑且称之为学生模型. 图1 其中包含3个变量,分别是:I(学生智力,有0和1两个状态).D(试卷难度,有0和1两个状态).G(成绩等级,有1.2.3三个状态). 表中就是概率的联合分布了,表中随便去掉所有包含某个值的行,就能对分布表进行缩减. 例如可以去掉所有G不为1的行,这样就只剩下了1.4.7.10行,这样他们的概率之和就不为1了,所以可以重新标准化(Renormalization).如图2所示. 图2 反之也可以

【点击模型学习笔记】Modeling contextual factors of click rates_MS_AAAI2007

概要 并没有觉得这是篇高质量的文章,很奇怪为什么能够发表在AAAI上面. 文章的创新点比较单薄:在传统点击率预测模型(LR)的基础上加入了两类新的特征,一个是位置特征,一个是广告上下文特征--即和它并排展示的其他广告的特征 具体内容 1. 建模 文章中,作者用了两种模型: (1)逻辑回归模型 作者用0-1特征,将位置信息作为一个种特征加入到模型当中:输出结果也是0-1二分类,表示用户是否点击了这个广告. 值得注意的是:作者认为,训练出来的模型参数,某个特征的系数值比较大,则这个特征也比较重要--

【点击模型学习笔记】Ad centric model discovery for redicting ads&#39; click through rate_ANT2013_Tencent

腾讯soso的人写的一篇文章,介绍soso广告系统的ctr预估技术.2013年的,应该反映了当前soso的ctr预估系统的情况. ANT会议质量一般,elsevier出版社出版.搞笑的是,文章摘要居然把论文模板上的这句话"Click here and insert your abstract text"原封不动的写在了第一句,并且就这样发表了! 主要内容: 描述soso搜索结果页面中广告点击率预测的系统实现. 具体内容: 1. 相关工作 Rechardson用逻辑回归来预测ctr ki

强化学习(David Silver)4:免模型学习

0.为什么免模型学习? PS:课程中迭代的值是值函数:周志华老师的西瓜书中迭代的是状态值函数:课程中迭代的是状态-动作值函数 1.蒙特卡洛方法:直接通过采样求和(v(s) = S(s)/n(s),其中S(s) = S(s) + G(t),G(t)=r(t+1)+r(t+2)+...) 1.1.蒙特卡洛增量计算方法(v(s) = v(s) + a*(G(t))) 2.TD算法 (v(s) =) 3.MC和TD的比较 1)TD在线实时学习:MC只能批量学习 2)TD不要完整的序列,不需要知道完整的结

【点击模型学习笔记】广告点击率估算技术综述_华东师范大学学报2013

概要: 不是一篇高质量文章,不过是一篇还算不错的综述,而且时间够新(2013). 具体内容:按照文章原本内容顺序罗列 0. 介绍 * 赞助商广告:投放到搜索结果页面 * 情境广告:在网页某个位置上投放,一般由广告联盟介入 1. 广告点击率预测的应用背景 * 广告点击率一般比较低,能达到0.2%就已经是很好的投放了 * 大量的广告.查询都是很稀疏的 * 利用用户点击行为的,除了点击率预测,还有两个领域:搜索结果排序和推荐系统 * "Inferring Clickthrough Rates on A