Qt Model/View之实现Item自定义显示
2017-06-05 10:58
2066 查看
介绍
Delegate 代理类被用来显示和编辑Item项。为了能实现自定义的Item,需要子类化代理类,并实现自己的paint() 和 sizeHint()方法。paint()方法会被每个Item调用,来绘制自定义的样式和相应的数据类型,sizeHint()方法用于指示每个Item的大小。在重绘Item在View中的显示时,QStyle类提供了很多的细节样式。在Qt4.4以后,有两个代理类QItemDelegate和QStyleItemDelegate继承自QAbstractItemDelegate,缺省的代理是QStyleItemDelegate,这两个类是相互独立的两个类,都用来显示和编辑Item项。这两个类之前不同之处在于,QStyleItemDelegate使用当前样式绘制Item,因此建议当自定义代理或者使用Qt样式表时,将QStyleItemDelegate作为子类的基类来使用。除非自定义代理需要使用样式来绘制,否则他们两个类所需要的代码应该是一样的。
本文主要使用子类化代理,实现了TreeView中Item的自定义显示。
demo概述
废话不多说,先看效果图,如果想实现这类的数据显示,那么,这篇文章的demo会对你有所启发。本demo主要的背景:有一些不同类型的设备,每个类型下又有若干节点。想要实现这种结构的数据的展示,并能支持某一类的全选,选中部分,同时使用checkbox显示三态(全选,选中部分,未选中)。
数据模型和视图
m_treeview_model = new QStandardItemModel(this); //使用通用数据模型 m_treeview_model->clear(); ui->treeView->setModel(m_treeview_model); //为TreeView设置数据模型 ui->treeView->setHeaderHidden(true); //不显示表头 ui->treeView->setIndentation(0); //Item的缩进为0 ui->treeView->setEditTriggers(QAbstractItemView::NoEditTriggers); //不支持Item的编辑 ui->treeView->setItemDelegate(new customtreeViewDelegate(this)); //设置自定义代理,用于自定义Item的显示 ui->treeView->setExpandsOnDoubleClick(false); //设置不允许双击Item时扩展该Item的子Item
自定义代理中paint()和sizeHint()方法的实现
//指示主Item项和childItem项的高度 QSize customtreeViewDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const{ if(!index.parent().isValid()) //mainItem return QSize(option.rect.width(), 30); else return QSize(option.rect.width(), 40); }
//绘制mianItem的checkbox auto data = model->data(index, Qt::CheckStateRole); QStyleOptionButton checkBoxStyle; if(data == Qt::Unchecked) { checkBoxStyle.state |= QStyle::State_Off; } else if(data == Qt::PartiallyChecked) { checkBoxStyle.state |= QStyle::State_NoChange; } else if(data == Qt::Checked) { checkBoxStyle.state |= QStyle::State_On; } checkBoxStyle.state |= QStyle::State_Enabled; checkBoxStyle.iconSize = QSize(20, 20); checkBoxStyle.rect = QRect(QPoint(option.rect.right()-30,option.rect.top()+5), QPoint(option.rect.right()-10,option.rect.bottom()-5)); QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter);
结语
自定义代理的paint()的实现,可以使用painter绘制任意的自定义Item,除了Text,可以是图片,其他多边形等等。之前有篇文章讲述了代理对Item的编辑功能,至此,代理对Item的展示和编辑都已经实现。对Item的编辑的介绍,可以查看文章http://blog.csdn.net/sxpsxp12/article/details/52402496
一如既往,提供了demo源码,欢迎下载。源码环境Qt5.6.2+MSVC2015测试通过。 http://download.csdn.net/detail/sxpsxp12/9860900
相关文章推荐
- qt利用委托:QStyledItemDelegate,实现tableview 的表格项的自定义显示,如插入图片,绘制控件
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- Qt4 model/view结构之实现自定义模型
- ViewPager嵌套RecycleView(Fragment作为数据源)来展示10条数据,每个Item显示的内容是(Android软件开发工程师)(用自定义的Adapter 实现
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)
- (五)Qt实现自定义模型基于QAbstractItemModel
- QT中,QTableView鼠标滑过某一item上时该item所在行的背景颜色变成其他颜色的实现方法
- android 让TextView支持的Html标签实现自定义时钟显示组件DigitalClock
- Qt:Drag-Drop操作在QGraphicsView及Model/View框架下的实现
- EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))
- Qt 自定义model实现文件系统的文件名排序
- Qt实现自定义模型基于QAbstractItemModel
- 实现自定义view(2):仿Android QQ多屏幕显示ListView的效果
- 自定义View -- 实现字符串按弧线位置显示
- 安卓自定义View实现图片上传进度显示(仿QQ)
- 自定义View -- 实现字符串一个一个显示的动态动画
- Qt:使用Model-View,动态的加载显示数据
- Android 自定义AutoCompleteTextView实现显示所有项
- Qt实现自定义模型基于QAbstractTableModel