1、第 8章 Qt 5模型 /视图结构概述8.18.2 模型( Model)视图( View)8.38.4 代理( Delegate)Qt的模型 /视图结构分为三部分:模型( Model)、视图( View)和代理(Delegate)。其中,模型与数据源通信,并为其他部件提供接口;而视图从模型中获得用来引用数据条目的模型索引( Model Index)。在视图中,代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。模型 /视图 /代理之间通过信号和槽进行通信,如图 8.1所示。8.1 概述8.1.1 基本概念1模型( Model)InterView框架中的所有模型都基于抽象基类 QAbst
2、ractItemModel类,此类由QProxyModel、 QAbstractListModel、 QAbstractTableModel、QAbstractProxyModel、 QDirModel、 QFileSystemModel、 QHelpContentModel 和QStandardItemModel类继承。其中, QAbstractListModel类和QAbstractTableModel类是列表和表格模型的抽象基类,如果需要实现列表或表格模型,则应从这两个类继承。8.1.1 基本概念2视图( View)InterView框架中的所有视图都基于抽象基类 QAbstractIt
3、emView类,此类由QColumnView、 QHeaderView、 QListView、 QTableView和 QTreeView类继承。其中, QListView类由 QUndoView类和 QListWidget类继承; QTableView类由QTableWidget类继承; QTreeView类由 QTreeWidget类继承。而 QListWidget类、QTableWidget类和 QTreeWidget类实际上已经包含了数据,是模型 /视图集成在一起的类。3代理( Delegate)InterView框架中的所有代理都基于抽象基类 QAbstractItemDelegat
4、e类,此类由 QItemDelegate 和 QStyledItemDelegate类继承。其中, QItemDelegate类由表示数据库中关系代理的 QSqlRelationalDelegate类继承。8.1.2 【实例】:模型 /视图类使用【例】(简单) 实现一个简单的文件目录浏览器,完成效果如图 8.2所示。实例文件见光盘 CH801。创建工程 “DirModeEx.pro”, 其源文件 “main.cpp”中的具体 代码 。最后运行结果如图 8.2所示。8.2 模型( Model)【例】(难度一般) 通过实现将数值代码转换为文字的模型来介绍如何使用自定义模型。此模型中保存了不同军种的
5、各种武器,实现效果如图 8.3所示。实例文件见光盘 CH802。8.2 模型( Model)具体操作步骤如下。( 1) ModelEx类继承自 QAbstractTableModel类, 头文件 “modelex.h”中的具体代码 。( 2) 源文件 “modelex.cpp”中的具体 代码 。populateModel()函数的具体实现代码如下:void ModelEx:populateModel()headertr(“军种 “)tr(“种类 “)tr(“武器 “);army12342431;weaponType13574862;weapontr(“B-2“)tr(“尼米兹级 “)tr(“阿
6、帕奇 “)tr(“黄蜂级 “)tr(“阿利伯克级 “)tr(“AAAV“)tr(“M1A1“)tr(“F-22“);8.2 模型( Model)columnCount()函数中,模型的列固定为 “3”,所以直接返回 “3”。int ModelEx:columnCount(const QModelIndex rowCount()函数返回模型的行数。int ModelEx:rowCount(const QModelIndex data()函数返回指定索引的数据, 即将数值映射为文字。8.2 模型( Model)表 8.1列出了 Item主要的角色及其描述。常 量 描 述Qt:DisplayRole
7、 显示文字Qt:DecorationRole 绘制装饰数据(通常是图标)Qt:EditRole 在编辑器中编辑的数据Qt:ToolTipRole 工具提示Qt:StatusTipRole 状态栏提示Qt:WhatsThisRole Whats This文字Qt:SizeHintRole 尺寸提示Qt:FontRole 默认代理的绘制使用的字体Qt:TextAlignmentRole 默认代理的对齐方式Qt:BackgroundRole 默认代理的背景画刷Qt:ForegroundRole 默认代理的前景画刷Qt:CheckStateRole 默认代理的检查框状态Qt:UserRole 用户自定义的数据的起始位置8.2 模型( Model)headerData()函数返回固定的表头数据,设置水平表头的标题,具体代码如下:QVariant ModelEx:headerData(int section, Qt:Orientation orientation, int role) constif(role=Qt:DisplayRolereturn QAbstractTableModel:headerData(section,orientation,role);