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

数据项中引入模型/视图架构,可以方便的将数据与表现层分开。

-------------------------------------

模型Model:一般来说,Model里面并不真正存储数据(数据少的话也可以直接存储在Model里),只是负责从诸如磁盘文件,数据库,网络通讯等获得源数据,并提供给View,View对数据进行修改,然后再通过Model更新源数据。

Model 另一个重要工作时为源数据添加索引(ModelIndex)。列表形式采用row/colum编号,树形式为建立父子间的层次关系而多添加了一个ParentIndex索引。

当View需要显示数据或者需要View中的指定数据项时,通过模块索引(ModelIndex)从Model中获取数据,如果View中添加了自定义“委托”,要通过调用mapFromSource
返回和源Model相映射的“委托模块”的索引来获取数据。

-------------------------------------

为每个视图都提供了一个默认的委托——可以使用自定义的委托来替换显示每一项,并为可编辑项提供一个合适的编辑器。

-------------------------------------

模型:用于存储数据项(data item)。

纯粹的视图部件:QListView、QColumnView、QTableView、QColumnView和QTreeView,必须为视图提供一个模型与之配合。

-------------------------------------

便利的窗口部件:QListWidget、QTableview和QTreeWidget,都有自己的内置模型并能直接使用。

QComboBox:既是一个便利窗口部件也是一个视图部件,即既能直接使用(内置的模型),也可当做视图(外部提供合适模型)。

-------------------------------------

QStyledItemDelegate委托:所有的标准视图都提供了一个默认的QStyledItemDelegate委托(显示视图中各个项并为可编辑的项提供一个合适的编辑器)。可以自定义委托,控制视图中的各个项的显示和编辑。

-------------------------------------

对于有数百或数千个项的数据集,假设数据集在任何时候仅仅显示在一个部件中,那么选择便利窗口部件(内置模型视图部件)比较合适。

-------------------------------------

尽管有统一的应用程序编程接口,但仍有两种不同类型的模型:行列特性表格模型和父子关系的树模型。

-------------------------------------

QStandardItemModel:是一个可被当成列表模型、表格模型或树模型来使用的通用模型。它提供了一个基于项的API。对于能够直接把数据恰好填充入列表、表格或树模型的各个数据项中,并能够直接使用或仅需做微小改动即可的情况,使用QStandardItemModel是理想的选择。

QAbstractTableModel:不保存数据,用户需要从这些类派生出子类,并在子类中定义某种数据结构来保存数据。与此不同,类QStandardItemModel负责保存数据,每个数据项被表示为类QStandardItem的对象。

QStandardItem数据项:一个数据项由若干个『角色/*字体、颜色等信息*/,数据子项』对组成,该类负责保存、访问这些数据。该类的内部定义了一个类型为QVector的容器,每个容器元素本质上存放一个『角色,数据子项』对,且各个角色可能对应具有不同类型的数据子项。

void setData ( const QVariant & value, int role)//将『role, value』对存入QStandardItem对象

QVariant data ( int role = ) const      //读取角色role对应的数据子项

QStandardItemModel将类QStandardItem表示的数据项组织起来,形成列表、表格、树甚至更复杂的数据结构。

QStandardItemModel提供了一组成员函数:添加数据项appendRow()/*数据集为列表形式*/,更改数据项或删除数据项。

void QStandardItemModel::appendRow(const QList<QStandardItem *> & items)

-------------------------------------

QSortFilterProxyModel代理:过滤数据,拥有“防火墙”的作用,限制输出到View中进行显示的数据。代理处理完数据,不是直接交给委托,而是交给View,View再负责传递给Item,Item再通过委托显示特定的样式。(代理->视图->委托->显示)

voidQSortFilterProxyModel::setSourceModel(QAbstractItemModel * sourceModel)

--------------------------------------

QStyledItemDelegate委托处理过程(Item默认使用textedit显示数据):

-------------------------------------

View通过ModelIndex从model中获取数据:

QVariant QAbstractProxyModel::data(const QModelIndex & proxyIndex, int role = Qt::DisplayRole) const

当Model中的data变化时,自动发dataChanged signal给所有的view以便它们更新。

View修改Model中对应ModelIndex的数据:

bool QAbstractProxyModel::setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole)

View负责组织数据并显示,但真正的显示工作交给代理delegate,代理负责最终的显示数据和处理用户交互的工作。

------------------------------------

通过代理delegate编辑并显示数据项的过程:

当通过双击鼠标或回车等操作触发了View的edit trigger时,Delegate会创建一个合适的widget

(如line edit或combo box等)处理用户的输入,用户编辑完成以后发射commitData“编辑完成信号”,

delegate通过setModelData将更新Model中的数据。

1)void paint(QPainter *painter, const QStyleOptionViewItem &option,  
//View通过delegate重绘Item、渲染内容

const QModelIndex &index) const;

------------------------------------

2)QWidget *createEditor(QWidget *parent,//创建修改数据编辑器

const QStyleOptionViewItem &option,

const QModelIndex &index) const;//QModelIndex选择需要进行渲染的列

void setEditorData(QWidget *editor,       //为editor提供编辑的原始数据

const QModelIndex &index) const;

//当用户开始编辑时,视图首先调用 委托的createEditor( ) 创建一个编辑器,然后调用 setEditorData( )

并使用当前数据项 Item 中的数据初始化编辑器。

------------------------------------

//当用户点击回车,或者从 QTimeEidt 等控件上失去输入焦点后,editingFinished() 信号就发送出来,

并且 commitAndColseEditor() 槽函数被调用。

connect( ..., SIGNAL(editingFinished()), ..., SLOT(CommitAndCloseEditor()) );

3)void ItemDelegate::CommitAndCloseEditor()

{

//QObject::sender()   Returns a pointer to the object that sent the signal

QTimeEdit *editor = qobject_cast<QTimeEdit *>(sender());    //使用 sender() 来获得编辑器

emit commitData( editor );//发送commitData() 信号提醒视图有一个已编辑好的数据需要更新了

emit closeEditor( editor );//发送closeEditor( ) 信号通知视图编辑控件不需要了,模型删除该编辑器

}

--------------------------------------

//获取编辑器中的数据并存储到指定模块索引的Model中

4)void setModelData(QWidget *editor, QAbstractItemModel *model,

const QModelIndex &index) const;

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

时间: 2024-10-11 05:19:30

QT——模型/视图(model/view)的相关文章

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)

Qt表格之Model/View实现

很多开发中都用到了表格,如何使用Qt做表格?比较简单的,我们可以使用QTableWidget,但是它有个问题,就是数据量不能太大,一旦数据量比较大的话就会带来内存问题.Qt还给我们提供了一样利器--Model/View.模型视图,接触Qt的都不会陌生,对新手来说可能不太好理解,没关系,Qt提供了强大的Assist文档和更加直观的Demo,相信看过之后使用来说就没有问题了.本篇文章来列出一个简单的例子,使用的就是表格的模型视图,在代码中给出了简单的注释说明.为什么要采用这种方式?试过的人都可以看到

38.Qt模型/视图结构

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

QT MVC 技术Model/View初探

Model/View实现表格技术 [+] 一.简介 Model/View结构使数据管理与相应的数据显示相互独立,并提供了一系列标准的函数接口和用于Model模块与View模块之间的通信.它从MVC演化而来,MVC由三种对象组成,Model是应用程序对象,View是它的屏幕表示,Controller定义了用户界面如何对用户输入进行响应.把MVC中的View和Controller合在一起,就形成了Model/View结构. 二.运行图 (1)为了灵活对用户的输入进行处理,引入了Delegate,Mo

Qt模型/视图、委托

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

QT 模型/视图 编程 委托篇

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

QT开发(三十六)——Model/View框架

QT开发(三十六)--Model/View框架 一.Model/View框架简介 1.Model/View框架核心思想 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自定义数据的显示方式,不关心数据如何组织存储. Model/View框架中数据与显示的分离,可以允许使用不同界面显示同一数据,也能够在不改变数据的情况下添加新的显示界面.为了处理用户输入,引入了委托(delegate).引入委托的好处是可以自定义数据项的渲

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

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

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

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