13.2.1 角色与数据子项
模型中的一个数据项会存放多个数据子项,其中一些是应用程序本身需要处理的数据,另外一些是Model/View框架中其他部分(比如视图对象、委托对象等)需要处理的。我们将一个数据子项所起的作用称为它的"角色"(role),因而一个数据项可被看作多个『角色,数据子项』对组成的集合。
例如,图13 8中的程序显示2011年世界10大新闻。左侧列表显示这些新闻的标题以及图标。用户单击其中一个后,程序在右上方显示该新闻的图片,在右下方以英文显示该新闻。如果用户将鼠标停留在列表中某个数据项的区域内,程序弹出一个提示框,显示该新闻中文版的文字。
我们使用一个具有列表结构的模型来表示这10条新闻,模型中的每个数据项表示一条新闻。新闻的标题(比如图中的"墨西哥海底雕塑")是一个数据子项,对应的角色为DisplayRole,视图对象总是显示这个数据子项。新闻的图标是一个数据子项,对应的角色为DecorationRole。视图对象可能显示这个数据子项,也可能忽略它而只显示DisplayRole对应的数据子项。提示框中的中文文字是一个数据子项,对应的角色为ToolTipRole。只要用户将鼠标停留在一个数据项的区域内,视图对象就会显示这个数据子项。以上角色对应的数据子项和Model/View框架密切相关,框架中的其他对象比如视图对象、委托对象等会读取这些数据子项并做相应的处理。应用程序还可以在角色UserRole对应的数据子项中存放一些与具体应用相关的数据,例如,本例将一条新闻的英文文字内容存放在这个数据子项中。当用户单击某个数据子项时,应用程序读取这个数据子项,将其中的文字显示在界面右下角的位置。
|
| (点击查看大图)图13 8 一个数据项含有不同角色的数据子项 |
通用的角色如表13 1所示,所有的角色名字都被定义在名字空间Qt中。所有数据子项都具有类型QVariant,但是QVariant中所存放的数据的类型会因角色的不同而不同。例如,对于角色WhatsThisRole,这个类型为QString,表示所要显示的文字,而对于角色SizeHintRole,这个类型为QSize,表示数据项的尺寸。当我们向数据子项写入数据时,应该遵循这些约定。
表13 1 通用的角色以及对应数据子项的功能与类型
|
常量< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
对应的数据子项 |
QVariant中数据的类型 |
|
Qt::DisplayRole |
代表一个数据项的文字 |
QString或者数值类型 |
|
Qt::DecorationRole |
代表一个数据项的图标 |
QColor, QIcon 或QPixmap |
|
Qt::EditRole |
对一个数据项进行编辑时所要处理的数据 |
QString或其他 |
续表
|
常量 |
对应的数据子项 |
QVariant中数据的类型 |
|
Qt::ToolTipRole |
鼠标停留在一个数据项区域内时,提示框中所要显示的文字 |
QString |
|
Qt::StatusTipRole |
鼠标停留在一个数据项区域内时,状态栏所要显示的文字 |
QString |
|
Qt::WhatsThisRole |
用户对一个数据项执行“What's This ”命令时所要显示的文字 |
QString |
|
Qt::SizeHintRole |
一个数据项所占据的屏幕尺寸 |
QSize |
和数据项外观相关的角色如表13 2所示。通过设置这些数据子项,应用程序可以控制数据项的外观。某些数据项被用来存放布尔类型的值,视图对象在显示DisplayRole对应的数据子项的同时,还可以显示一个复选框。角色CheckStateRole对应的数据子项表示这个复选框的状态。
表13 2 和数据项外观相关的角色
|
常量 |
对应的数据子项 |
QVariant中数据的类型 |
|
Qt::FontRole |
显示DisplayRole对应数据子项时所用的字体 |
QFont |
|
Qt::TextAlignmentRole |
显示DisplayRole对应数据子项时所用的文字对齐方式 |
Qt::AlignmentFlag |
|
Qt::BackgroundRole |
显示DisplayRole对应数据子项时所用的背景刷子 |
QBrush |
|
Qt::BackgroundColorRole |
过时的角色,应该使用BackgroundRole |
-- |
|
Qt::ForegroundRole |
显示DisplayRole对应数据子项时所用的背景刷子 |
QBrush |
|
Qt::TextColorRole |
过时的角色,应该使用ForegroundRole |
-- |
|
Qt::CheckStateRole |
一个数据项的复选状态 |
Qt::CheckState |