如何自定義QTreeWidgetItem的圖標?

如何自定義QTreeWidgetItem的圖標?

如圖所示樹形控件中的三個item,data1、data2和data3前面的環形圖標分別表示它們的數據,環形圖標會隨著數據變化而變化。那麼如何實現這種自定義的圖標呢?其實很簡單,只需要為樹形控件定製一個代理(或者叫委託)即可。


1.首先創建一個代理類,繼承於QStyledItemDelegate。重寫paint函數和sizeHint函數。前者用於繪製item,自定義的內容都在paint函數里實現,後者用戶指定item的大小。

如何自定義QTreeWidgetItem的圖標?


2.在sizeHint函數中設置item的高度

如何自定義QTreeWidgetItem的圖標?

首先通過調用父類的sizeHint函數得到一個大小,然後設置高度,最後返回這個QSize對象即可。


3.在paint函數中繪製圖標

如何自定義QTreeWidgetItem的圖標?

首先判斷當前item是不是data這一級別的,如果是才需要自己繪製,否則直接用父類的方式處理。這裡的type通過data函數獲取,而type的設置是由QTreeWidgetItem的setData函數實現的。也就是說item和代理之間可以通過data/setData進行交互。


圖標的繪製,先算出一個矩形區域用於繪製,然後計算數據所佔的弧度長,代碼如下:

如何自定義QTreeWidgetItem的圖標?

option.rect表示整個item所佔的矩形區域,知道這個就可以自己分配各個數據的繪製區域了。 drawArc用於繪製弧線,第二和第三個參數都是弧度值(用角度乘以16)。


4.使用代理。 代理的使用很簡單,只需要調用QTreeWidget的setItemDelegate函數,把代理對象傳進去即可。

如何自定義QTreeWidgetItem的圖標?

QTreeWidgetItem通過setData設置數據,在第3步中已經提到了。


分享到:


相關文章: