QAbstractItemModel简介

QAbstractItemModel简介

详细描述

	QAbstractItemModel定义了项目模型必须使用的标准接口,以便能域模型/视图建结构体系中的其他组件进行交互操作。
	QAbstractItemModel类是Model/View Classed类之一,是QT的Model/view框架内容的一部分。它可以用作QML中的项视图元素或QT Widget模块的项视图类的底层数据模型。
	如果你需要一个模型来使用项视图,比如QML的QList视图或C++ widgets的QlistView或QTableView,你应该考虑子类化 QAbstractListModel 或QAbstractTableModel来代替该类。
	![在这里插入图片描述](https://img-blog.csdnimg.cn/041793c097934291b655abcf49ad0c42.png#pic_center)
	每一个可以通过模型访问的数据项都有一个关联的模型索引。可以通过index()方法得到模型索引。每个索引可以有sibing()索引,子项可以有一个parent()索引。
	每个项目都有许多的数据元素,可以通过向模型的data函数指定一个角色(Qt::ItemDataRole))来检索他们。可以通过使用ItemData()函数同时获取所有可用角色的数据。
	每个角色的数据使用特定的Qt::ItemDataRole进行设置。使用setData()单独的设置有效角色的数据,也可以使用setItemData()设置所有角色的数据。
	可以使用flags()方法(Qt::ItemFlag)查询项目,以查看是否可以选择、拖拽或其他的方法来操作他们。
	如果一个item有子对象,hasChildren()方法为对应的索引返回true。
	该模型对层次结构的每一层都有一个rowCounr()和columnCount()方法。可以使用insertRows(), insertColumns(), removeRows(), and removeColumns()插入和删除行和列。
	模型通过发出信号来指示更改。例如,当模型的可用数据项发生改变时,就会发出dataChange() 信号。对模型提供的头的更改会导致发出headerDataChange() 信号。如果底层数据的结构发生改变,模型可以发出layoutChange() 信号,向任何附加的视图指示他们应该重新显示所显示的项,同时考虑新的结构。
	可以通过match() 方法搜索模型的可用项,以获取特定的数据。
	可以使用sort() 函数来将模型排序。

子类化(Subclassing)

	当子类化QAbstractItemModel时,至少必须实现index(), parent(), rowCount(), columnCount(), and data()。这些方法在所有只读模型中都有使用,并构成了可编辑模型的基础。
	你还可以重新实现haChildren() ,为rowCount()的实现花销很大的模型提供特殊的行为。这使模型可以限制视图请求的数据量,并且可以作为一种实现模型数据惰性填充的方法。
	要在模型中启用编辑,必须实现setDtat(),和重新实现flags()来确保返回ItemIsEditable。可以重新实现headerData()和setHeaderData()来控制模型头的显示方式。
	必须在重新实现的setData()和setHeaderData()方法中,分别显式的发出dataChaged()、headerDataChanged()信号。
	定制模型需要为其他组件创建模型索引。为此,调用createIndex()方法,其中包括项目的合适的行、列,以及标识符,标识符可以是指针或整数值。这些值的组合对于各个item来说必须是唯一的。定制模型通常在其他重新实现的方法中使用这个唯一标识符来检索项目数据、访问项目的父对象或子对象的信息。
	不必支持Qt::ItemDataRole中所有定义的角色。根据模型中包含的数据类型,可能只实现data()中一些通用的角色才有用。大多数模型至少为Qt::DisplayRole提供了项数据的文本表示,行为良好的模型也应该为Qt::ToolTipRole和Qt::WhatsThisRole提供的说明。支持这些角色可以使模型能和标准的QT视图一起使用。然而,对于一些处理高度专业化数据的模型,可能只提供用户定义的角色也是合适的。
	为可调整大小的数据结构提供接口的模型可以提供insertRows(), removeRows(), insertColumns(),and removeColumns()的实现。在实现这些函数时,必须注意在模型的维度发生变化之前和之后,通知所有连接的视图。
	insertRows()实现必须在向数据结构中插入前调用beginInsertRows(),插入结束后调用endInsertRows()。其他方法同理,需调用对应的不同方法。
	这些函数发出的私有信号使附加组件有机会在任何数据变得不可用之前采取行动。使用这些begin和end函数封装插入和删除操作还使模型能够正确地管理持久模型索引。如果希望正确处理选择,则必须确保调用了这些函数。如果插入或删除带有子项的项,则不需要为子项调用这些函数。换句话说,父项将负责其子项。
	要创建增量填充的模型,可以重新实现fetchMore()和canFetchMore()。如果fetchMore()的重新实现将行添加到模型中,则必须调用beginInsertRows()和endInsertRows()。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值