如圖所示樹形控件中的三個item,data1、data2和data3前面的環形圖標分別表示它們的數據,環形圖標會隨著數據變化而變化。那麼如何實現這種自定義的圖標呢?其實很簡單,只需要為樹形控件定製一個代理(或者叫委託)即可。
1.首先創建一個代理類,繼承於QStyledItemDelegate。重寫paint函數和sizeHint函數。前者用於繪製item,自定義的內容都在paint函數里實現,後者用戶指定item的大小。
2.在sizeHint函數中設置item的高度
首先通過調用父類的sizeHint函數得到一個大小,然後設置高度,最後返回這個QSize對象即可。
3.在paint函數中繪製圖標
首先判斷當前item是不是data這一級別的,如果是才需要自己繪製,否則直接用父類的方式處理。這裡的type通過data函數獲取,而type的設置是由QTreeWidgetItem的setData函數實現的。也就是說item和代理之間可以通過data/setData進行交互。
圖標的繪製,先算出一個矩形區域用於繪製,然後計算數據所佔的弧度長,代碼如下:
option.rect表示整個item所佔的矩形區域,知道這個就可以自己分配各個數據的繪製區域了。 drawArc用於繪製弧線,第二和第三個參數都是弧度值(用角度乘以16)。
4.使用代理。 代理的使用很簡單,只需要調用QTreeWidget的setItemDelegate函數,把代理對象傳進去即可。
QTreeWidgetItem通過setData設置數據,在第3步中已經提到了。
關鍵字: 代理 QTreeWidgetItem data