版權聲明:本文爲博主原創文章,遵循 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源碼