版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接和本声明。
本文连接:https://blog.csdn.net/sxpsxp12/article/details/72865083
介绍
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的自定义显示。ui
demo概述
废话很少说,先看效果图,若是想实现这类的数据显示,那么,这篇文章的demo会对你有所启发。this
本demo主要的背景:有一些不一样类型的设备,每一个类型下又有若干节点。想要实现这种结构的数据的展现,并能支持某一类的全选,选中部分,同时使用checkbox显示三态(全选,选中部分,未选中)。.net
数据模型和视图
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
1
2
3
4
5
6
7
8
9
自定义代理中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);
}
1
2
3
4
5
6
7
//绘制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));blog
QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
结语
自定义代理的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
————————————————
版权声明:本文为CSDN博主「sxpsxp12」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/sxpsxp12/article/details/72865083源码