QT里将List,Tree,Table统一按Model / View的构架进行设计(使用方法类似)
Model:管理数据项
View:负责显示
QListWidget:负责以列表形式显示数据,其中数据称为item,每个item至少包括图标,文本和关联数据。
添加项:ListWidget 的 addItem()函数 / insertItem()函数
示例:ui.listWidget->addItem(new QListWidgetItem( icon1,"xxxx"));
或者:QListWidgetItem xxx = new QListWidgetItem( icon1,"xxxx");
ui.listWidget->addItem(xxx);
ListWidget被销毁时,对象跟着被销毁。
移除项:takeItem()函数(只是移除项,不是销毁项,还可以重新插入列表。要删除必须手工delete item。要想有点删除后图标消 失的效果,则需要先移除再删除)
显示模式:列表方式 ListMode
图标方式 IconMode
可用ui.listWidget的viewMode来检测当前是什么模式
可用ui.listWidget的setViewMode来切换模式
每一项都可以关联很多个数据(data),每个数据都有一个id(称为role)。
关于role的说明:(来自于《Qt中的C++技术》这本书)
模型中的一个数据项会存放多个数据子项,其中一些是应用程序本身需要处理的数据,另外一些是Model/View框架中其他部分(比如视图对象、委托对象等)需要处理的。我们将一个数据子项所起的作用称为它的“角色”(role),因而一个数据项可被看作多个『角色,数据子项』对组成的集合。
例如,图13 8中的程序显示2011年世界10大新闻。左侧列表显示这些新闻的标题以及图标。用户单击其中一个后,程序在右上方显示该新闻的图片,在右下方以英文显示该新闻。如果用户将鼠标停留在列表中某个数据项的区域内,程序弹出一个提示框,显示该新闻中文版的文字。
我们使用一个具有列表结构的模型来表示这10条新闻,模型中的每个数据项表示一条新闻。新闻的标题(比如图中的“墨西哥海底雕塑”)是一个数据子项,对应的角色为DisplayRole,视图对象总是显示这个数据子项。新闻的图标是一个数据子项,对应的角色为DecorationRole。视图对象可能显示这个数据子项,也可能忽略它而只显示DisplayRole对应的数据子项。提示框中的中文文字是一个数据子项,对应的角色为ToolTipRole。只要用户将鼠标停留在一个数据项的区域内,视图对象就会显示这个数据子项。以上角色对应的数据子项和Model/View框架密切相关,框架中的其他对象比如视图对象、委托对象等会读取这些数据子项并做相应的处理。应用程序还可以在角色UserRole对应的数据子项中存放一些与具体应用相关的数据,例如,本例将一条新闻的英文文字内容存放在这个数据子项中。当用户单击某个数据子项时,应用程序读取这个数据子项,将其中的文字显示在界面右下角的位置。
通用的角色如表13 1所示,所有的角色名字都被定义在名字空间Qt中。所有数据子项都具有类型QVariant,但是QVariant中所存放的数据的类型会因角色的不同而不同。例如,对于角色WhatsThisRole,这个类型为QString,表示所要显示的文字,而对于角色SizeHintRole,这个类型为QSize,表示数据项的尺寸。当我们向数据子项写入数据时,应该遵循这些约定。
常量 | 对应的数据子项 | QVariant中数据的类型 |
Qt::DisplayRole | 代表一个数据项的文字 | QString或者数值类型 |
Qt::DecorationRole | 代表一个数据项的图标 | QColor, QIcon 或QPixmap |
Qt::EditRole | 对一个数据项进行编辑时所要处理的数据 | QString或其他 |
Qt::ToolTipRole | 鼠标停留在一个数据项区域内时,提示框中所要显示的文字 | QString |
Qt::StatusTipRole | 鼠标停留在一个数据项区域内时,状态栏所要显示的文字 | QString |
Qt::WhatsThisRole | 用户对一个数据项执行“What's This?”命令时所要显示的文字 | QString |
Qt::SizeHintRole | 一个数据项所占据的屏幕尺寸 | QSize |
和数据项外观相关的角色如表13 2所示。通过设置这些数据子项,应用程序可以控制数据项的外观。某些数据项被用来存放布尔类型的值,视图对象在显示DisplayRole对应的数据子项的同时,还可以显示一个复选框。角色CheckStateRole对应的数据子项表示这个复选框的状态。
常量 | 对应的数据子项 | 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 |
当使用UserRole来使用32以后的数据时(例如重写addItem函数使该函数能添加2个数据为32以后的项时),需要自定义用Delegate。
Delegate的使用方法:1.派生QStyledItemDelegate得到一个子类(至少要重写paint()函数来决定如何绘图和sizeHint()函数来决定每个项的尺寸)
class MyItem : public QStyledItemDelegate
2.为QListWidget指定一个Delegate。
MyItem *dele = new MyItem(ui.listWidget)
ui.listWidget->setItemDelegate(dele)
QListWidgetItem的对象的setData()函数用于关联数据,data()函数用于取出数据(一般在后面还要跟.toint()或者tobool()什么的,根据需要),这两个函数括号内跟的都是role。
role也可以用+1来表示下一个数据例如UserRole表示的是33。
QAbstractItemModel的对象也可以用于处理数据(用于ModelView表格控件)
ListWidget内部有一个model对象,可以按ModelView标准来处理。