2009-12-27 71 views
3

我有一個QTreeView子類(和QAbstractItemModel子類),它有一個很好的水平頭。我想添加垂直標題(沿着左側)以匹配。但與具有獨立垂直(setVerticalHeader())和水平標題(setHorizontalHeader())的QTableView不同,QTreeView僅允許一個標題(setHeader())。添加垂直頭到QTreeView

我知道我可以假裝最左邊的列是標題並使用不同的背景顏色呈現它(我不需要調整行或重新排列行的功能,所以我不必實施任何這些特殊行爲)。但是這並沒有考慮到當地的風格。例如,在我的系統中,標題有一個輕微的漸變,給他們幾乎3D的外觀。

因此,我正在尋找一種方法來添加一個適當的垂直標題(我猜它會是QHeaderView的一個子類),或者在最左邊的列中渲染一個標題,但將其渲染爲正確的方式。

回答

2

你可能有權利,你將不得不「假裝」,但你應該能夠繪製它看起來像你的水平標題。

您需要做的是負責這些單元格的paintEvent,然後使用當前樣式繪製自定義控件。喜歡的東西:

//QWidget* w is the widget who's style you want 
QPainter painter(this); 
QStyleOptionHeader opt; 
opt.initFrom(this); 
opt.state = QStyle::State_None; 
opt.orientation = Qt::Vertical; 
opt.state |= QStyle::State_Vertical; 
if (w->isEnabled()) 
    opt.state |= QStyle::State_Enabled; 
opt.state |= QStyle::State_Active; 
w->style()->drawControl(QStyle::CE_Header, &opt, &painter, w); 

最簡單的方法是負責爲你想將創建一個自定義項目委託和重新實現virtual void paint (QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const = 0方法細胞油漆的事件。您只需將您的繪畫放在您關心的索引上,然後將其餘部分傳遞給超類(請參閱Qt的此類文檔)。