QT学习笔记(6):列表控件

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标准来处理。

          

原位编辑:双击一个项,直接在项的位置调出编辑器来改项的文本信息
                 1.同样派生QStyledItemDelegate得到一个子类
                 2.创建一个widget作为编辑器:重写createEditor()函数 (QWidget类,编辑器一开始是空的)
                 3.调用编辑器的显示位置:重写updateEditorGeometry()函数  (用编辑器盖住项)
                 4.初始化显示数据:重写setEditorData()函数 (即把原来项里的信息传到编辑器里)
                 5.用户完成编辑之后,编辑器关闭,提供数据到model:重写setModelData()函数
用户启用原位编辑时,QListWidget按顺序调用上面4个函数


给QListWidget添加右键支持,点右键弹出快捷菜单:
(1)设置菜单策略:setContextMenuPolicy(Qt::CustomContextMenu)
(2)关联信号:customContextMenuRequested()    (QWidget里有这个基类可直接用)
(3)事件处理(slot):构造菜单和显示 (用QMenu这个类,给QMenu对象添加action:addAction()函数,显示QMenu对象用exec()函数,显示位置用QPoint对象决定【要转换到全局坐标,用ui->listWidget的mapToGlobal()函数】
(4)菜单响应(action):




树控件 QTreeWidget
每一项有多个列,每一个列相当于一个属性

添加列头标题的方法:1.直接双击Tree Widget即可弹出编辑框    
QTreeWidget的属性栏有很多有趣的东西                   



表格控件 QTableWidget:成行列显示,每个单元格独立,每一个单元格是一个Item




在ItemView中添加控件:
1.要先把item添加(addTopLevelItem函数)到ui->treeWidget
2.然后才可以添加控件(setItemWidget函数)

你可能感兴趣的:(QT学习笔记(6):列表控件)