Qt中如何自定义ListView/TreeView单个item的显示和响应

所有GUI的应用程序中Model/View都是一种非常常见的模式,Qt当然也不例外,不过跟MFC/WTL之类又有不同。本文简要说明了如何在Qt Model/View框架下实现自定义ListView的显示和响应。

 

假设我们有这样的情形:在Widows Explorer中,当我们用“Details”模式来显示文件夹信息时,可以看到诸如文件名、大小、创建日期、类型等信息。现在我们要修改的一栏是Tag(在Vista可以看到)。

假设我们有这样的需求:用户可以单击Tag这一栏,从右键菜单中选择“编辑Tag”,然后View给出一个ComboBox控件,可以自己输入或者从已有的tag中选择。

 

在继续往下看之前,想想如果是你如何实现(C++)?

 

我相信有人会想到重新派生一个View对象,响应用户操作,并完成对model的修改。这样当然可以实现目标,但是考虑到如果有其他的column也有类似的需求,那View的代码可能会比较复杂。

 

我们再看看用Qt如何实现:

概述:创建Delegate对象,为ListView的某一栏指定Delegate,Deletage对象负责显示以及响应操作。

具体步骤:

1. 从QItemDelegate或者QStyledItemDelegate派生一个对象,并实现几个简单的接口:

createEditor:创建用于编辑对象的控件,比如这里是ComboBox。

setEditorData:初始化编辑控件的数据,比如这里需要populate ComboBox的内容,把当前Tag设置为ComboBox的值。

setModelData:响应ComboBox完成编辑的消息,用新的数据更新Model中的信息。

2. 获取ListView的指针,通过函数setItemDelegateForColumn将新的Deletage设置到View中。

3. 设置trigger或者响应右键菜单启动ListView的Edit模式。

 

如果要自定义显示,则在Delegate中实现paint函数即可。怎么样,简单吧。

 

Qt自带的例子有更详细的说明:http://doc.trolltech.com/4.5/model-view-delegate.html

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页