Qt模型/视图中的data和headerData

QAbstractItemModel

QAbstractItemModel是一个抽象类,该抽象类未实现的纯虚方法有

QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex()) const [pure virtual]

QModelIndex QAbstractItemModel::parent(const QModelIndex & index) const [pure virtual]

int QAbstractItemModel::rowCount(const QModelIndex & parent = QModelIndex()) const [pure virtual]

int QAbstractItemModel::columnCount(const QModelIndex & parent = QModelIndex()) const [pure virtual]

QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const [pure virtual]

index()

当模型是一个层级模型时,index()用于返回当父层级为parent时,parent下位置为(row, column)的子索引。

parent()

返回index的父索引,如果index为根索引或者index是无效索引,则返回QModelIndex()。

rowCount()

用于告诉模型和视图,除去行标题之后,源数据的数据行数。

columnCount()

用于告诉模型和视图,除去列标题之后,源数据的数据列数。

data()

模型获取数据的具体实现。

该模型已经实现的重要虚方法有headerData()

virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

该方法的默认实现为:无论方向如何当role为Qt::DisplayRole则返回值为section+1的标题号,其他情形则返回空QVariant实例。

以前在套用书上的例子写表格时,数据都能正常显示。这次全部自己来写却发现表格视图的列标题不显示。经过调试发现只进行方向的判断是不显示标题数据的,只有再进行了角色判断才会正确地显示标题。按理说只进行方向判断是包含了既进行了方向判断又进行角色判断这一情况的。最后查看QAbstractItemModel源码才明白过来,模型(也可能是视图)只会对空的QVarient,而不会对无意义的尺寸设置合适的尺寸。本来想看看到底是模型在设置默认值还是视图在设置默认值的,但最后放弃了,一个函数定义好找,一个函数调用就太麻烦了。

无论是data()还是headerData(),在交付数据时我们都需要对数据的角色进行判断,进而给出相应的数据,否则可能导致视图无法显示数据,或者数据显示的方式不合理。数据不能显示的原因在于若模型需要获取表格的尺寸暗示时,此时的角色是Qt::SizeHintRole。若我们给出的是非空QVarient实例,那么模型将会使用该实例所包含的尺寸数据,若该尺寸数据有意义那么模型将使用该数据来定义表格大小,否则将表格尺寸设置为0x0(猜测);若我们给出的是空QVarient实例,那么模型或者视图将会自行设置合理的尺寸。同理,对于其它影响数据显示的角色,我们也需要进行角色判断,并给出合适的数据。

Qt模型/视图中的data和headerData

时间: 2024-08-05 09:34:59

Qt模型/视图中的data和headerData的相关文章

第61课 模型视图中的委托(上)

1. Qt模型视图对用户输入的处理 (1)传统的MVC设计模式 (2)Qt中的模型视图设计模式如何处理用户输入? ①视图中集成了处理用户输入的功能(即委托) ②视图将用户输入作为内部独立的子功能来实现 ③模型负责组织数据,视图负责显示数据,委托则用于编辑修改数据. 2. 模型视图中的委托 (1)委托(Delegate)是视图中处理用户输入的部件(如编辑框.单选按钮等) (2)视图可以设置委托对象用于处理用户输入 (3)委托对象负责创建和显示用户输入的上下文(内容),如编辑框的创建和显示. (4)

QT——模型/视图(model/view)

数据项中引入模型/视图架构,可以方便的将数据与表现层分开. ------------------------------------- 模型Model:一般来说,Model里面并不真正存储数据(数据少的话也可以直接存储在Model里),只是负责从诸如磁盘文件,数据库,网络通讯等获得源数据,并提供给View,View对数据进行修改,然后再通过Model更新源数据. Model 另一个重要工作时为源数据添加索引(ModelIndex).列表形式采用row/colum编号,树形式为建立父子间的层次关系

38.Qt模型/视图结构

1 模型/视图类 InterView框架提供了一些可以直接使用的模型类和视图类,如QStandardModel类,QDirModel类,QStringListModel类,以及QColumnView类,QHeaderView类,QListView类,QTableView类和QTreeView类 简单目录浏览器: 1 #include "mainwindow.h" 2 #include <QApplication> 3 4 #include <QAbstractItem

第62课 模型视图中的委托(下)

1. 委托的本质 (1)为视图提供数据编辑的上下文环境 (2)产生界面元素的工厂类 (3)能够使用和设置模型中的数据 2. 自定义委托类 (1)自定义委托类的继承关系 (2)自定义委托时需要重写的函数 ①createEditor ②updateEditorGeometry ③setEditorData ④setModelData ⑤paint(可选) (3)自定义委托时重写的函数由谁调用? 由于模型视图设计模式,视图中组合了委托对象,既然委托存在于视图内部,就应该由视图来调用(可从上图的函数调用

Qt模型/视图、委托

MVC视图和控制器对象相结合,其结果是模型/视图结构,仍然分离了数据与呈现给用户的方式,使得它可以在几个不同的视图中显示相同的数据,并实现新类型的视图而无需改变底层的数据结构.为了灵活的处理数据输入,则引入委托的概念.在此框架中引入委托的有点事:允许项目数据显示和自定义编辑. 模型与数据源进行通信,在这个体系结构中为其它组件提供了一个接口.通信的性质依赖于数据源的类型以及模型的实现方式. 视图从模型中得到模型索引,这些都是引用到数据项.通过为模型提供模型索引,视图可以从数据远中检索数据项. 在标

QT 模型/视图 编程 委托篇

委托类 概述 与模型-视图-控制器模式不同,模型/视图设计不包括用于管理与用户交互的完全独立的组件.通常,视图负责向用户表示模型数据,并处理用户输入.为了在获取输入的方式上允许一定的灵活性,交互由委托执行.这些组件提供输入功能,并负责在某些视图中呈现各个项.控制委托的标准接口在QAbstractItemDelegate类中定义. 委托应该能够通过实现paint()和sizeHint()函数来呈现它们自己的内容.然而,简单的基于widget的委托可以子类化QItemDelegate而不是QAbst

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定义的 无论

QT开发(八)——QT单元视图组件

QT开发(八)--QT单元视图组件 QT中有四种单元视图组件,分别为列表视图QListView.树形视图QTreeView.表格视图QTableView.列视图QColumnView. 一.QListView列表视图 1.QListView组件简介 QListView列表视图,继承自QAbstractItemView.QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式. 2.QListView组件属性 QListView组件属性设置: A.n

Qt之模型/视图(实时更新数据)

上两节简单介绍了Qt中对于模型/视图的编程,大部分助手里说的很清楚了,现在就开始实战部分吧! 在实际应用中,视图展示的数据往往并非一成不变的,那么如何实时更新成了一个很重要的问题!功能:(1)添加委托(进度条)(2)显示文件名称.大小.进度.速度.剩余时间.状态等.(3)可进行添加.更新.删除.清空等操作.(4)实时更新数据先看一个效果图:委托(进度条):ProgressBarDelegate::ProgressBarDelegate(QObject *parent): QItemDelegat