模型正在维护的数据,不仅是视图中所看到的那些,还有很多数据在视图是被隐藏的,你看不到,不代表他没有,比如,一个列表视图中,不仅会显示文字,文字前可能还会显示一个图标。
也就是说,model会维护每一个单元格的数据,而且每个单元格的数据都是一个结构体:不仅包含了文字,还有文字的颜色、单元格的背景色、图标等等,还有很多,不一一列举了,到底有哪些呢,看一下枚举Qt::DisplayRole 就知道了,在QT5.10中,有22个,以后随着QT版本更新,这个值可能会变化。
因此,当视图View向模型Model索要数据时,不仅要提供索引 index,还必须要提供角色role。index和role共同决定出视图到底在向Model请求哪个数据。也就是说,在model的某个索引下,会指向至少22个数据,然后进一步地,由role来决定到底是这22个数据中的那一个。真正实现了数据/视图的分离。
下面我们来看一下视图View向模型Model索要数据的函数原型:
确实如此,只不过角色role有个默认值,调用者只需提供index即可从model中拿到数据,这个数据将被用于显示成文字,因为Qt::DisplayRole的作用就是索要文字。
下面我们把所有的角色枚举的功能,都翻译一下,列出来供大家查阅:
Qt::DisplayRole 默认值 | 0 | 视图的单元格一般状态下(例如初始化显示时,编辑完成时),要显示的数据。 (QString) 这个是默认值,最重要的一个角色 |
Qt::DecorationRole | 1 | |
Qt::EditRole | 2 | 当单元格(item)进入编辑态时(一般双击会进入编辑态),要显示的数据, 一般会将其返回值设置为和Qt::DisplayRole 一样 (QString),我后续博文《自定义模型》有示例用法 |
Qt::ToolTipRole | 3 | 在该项的工具提示中显示的数据. (QString) |
Qt::StatusTipRole | 4 | 状态栏中显示的数据. (QString) |
Qt::WhatsThisRole | 5 | “这是什么?”模式下要显示的问题. (QString) |
Qt::SizeHintRole | 13 | 该项在视图中的默认大小 (QSize) |
Qt::FontRole | 6 | 用于使用默认委托呈现的项目的字体. (QFont) |
Qt::TextAlignmentRole | 7 | 使用默认委托呈现的项的文本对齐方式. (Qt::Alignment) |
Qt::BackgroundRole | 8 | 用于使用默认代理渲染的项目的背景笔刷. (QBrush) |
Qt::BackgroundColorRole | 8 | 该值已淘汰。请改用BackgroundRole |
Qt::ForegroundRole | 9 | 用于使用默认代理渲染的项目的前景笔刷(通常为文本颜色). (QBrush) |
Qt::TextColorRole | 9 | 该值已淘汰 |
Qt::CheckStateRole | 10 | 此角色用于获取项目的选中状态。. (Qt::CheckState) |
Qt::InitialSortOrderRole | 14 | 此角色用于获取标题视图节的初始排序顺序. (Qt::SortOrder). 至少 Qt 4.8. |
Qt::AccessibleTextRole | 11 | 可访问性扩展和插件(如屏幕阅读器)使用的文本。. (QString) |
Qt::AccessibleDescriptionRole | 12 | 出于可访问性目的对项目的描述 (QString) |
Qt::UserRole | 0x0100 | 第一个可用于特定应用程序目的的角色 |