改變QTreeView項高的方法(改變Delegate行高,或者::data取數據的時候,根據Qt::SizeHintRole進行判斷)


很久之前寫過一篇關於QTreeView快速顯示超過千萬條數據項的方法,如果說那篇文章講的是QTreeView的內功的話,今天這篇是講QTreeView的外功,有時我們想改變視圖的數據項的行高,那怎么辦呢?今天在這里介紹兩種改變行高的方法:

1.通過更改QTreeView的默認delegate的方法

 

[cpp]  view plain  copy
 
  1. class CDelegate : public QStyledItemDelegate  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     CDelegate(QObject *parent) : QStyledItemDelegate(parent)  
  6.     {  
  7.   
  8.     }  
  9. protected:  
  10.     QSize sizeHint(const QStyleOptionViewItem &option,  
  11.                                const QModelIndex &index) const  
  12.     {  
  13.         QSize size = QStyledItemDelegate::sizeHint(option, index);  
  14.         return QSize(size.width(), 28);  
  15.     }  
  16. };  

默認的情況下,QTreeView采用QStyledItemDelegate作為其代理,通過重載QStyledItemDelegate的sizeHint方法,我這里把行高設為28,大家可以根據需要修改對應的行高,然后,通過QTreeView的默認代理替換為CDelegate,我的做法如下:

 

 

[cpp]  view plain  copy
 
  1. CTreeView::CTreeView(QWidget *parent) : QTreeView(parent)  
  2. {  
  3.     CDelegate *pDelegate = new CDelegate(this);  
  4.     setItemDelegate(pDelegate);  
  5.     setUniformRowHeights(true);  
  6. }  

大家看是不是很簡單

 

2.通過重載QAbstractItemModel的data方法,如下:

 

[cpp]  view plain  copy
 
  1. QVariant CMChModel::data(const QModelIndex &index, int role) const  
  2. {  
  3.     if (!index.isValid())  
  4.         return QVariant();  
  5.     if (Qt::SizeHintRole == role)  
  6.     {  
  7.         return QSize(pTreeView->visualRect(index).width(), 28);  
  8.     }  
  9.     return QVariant();  
  10. }  

 

其中pTreeView就是上面的CTreeView,這中方法不用在CTreeView構造函數中加:

 

[cpp]  view plain  copy
 
  1. CDelegate *pDelegate = new CDelegate(this);  
  2. setItemDelegate(pDelegate);  

 

是不是也很簡單。

http://blog.csdn.net/rabinsong/article/details/13161799


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM