2017-02-08 41 views
0

我有一個QTreeView顯示我的數據,我已經安裝了一個自定義的代表到其中一列顯示一個彩色的進度條,外觀取決於內容。我能夠模擬使用提供的顏色信息的默認委託行爲由option.paletteQTreeView自定義項目顯示代理和CSS

class ProgressBarDelegate : public QStyledItemDelegate 
{ 
public: 
    ProgressBarDelegate(QObject *parent = 0) {} 
    ~ProgressBarDelegate() {} 
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
    { 
     // QStyledItemDelegate::paint(painter, option, index); // default implementation 

     painter->save(); 

     // progressbar construction and drawing 

     painter->restore(); 
    } 
}; 

現在,我想強調鼠標懸停事件一行。我設置自定義CSS樹視圖:

ui->treeView->setStyleSheet("QTreeView::item:hover{background-color:#D0E0F0;}"); 

懸停突出的作品,但是,果然,我的自定義委託執行忽略CSS設置:

Without defaulte delegate

(Darkblue線是選擇item,lightblue-ish行是CSS懸停高亮行)

啓用默認實現允許CSS設置影響我的代理,但它弄亂了圖片:

With default delegate

的問題是:

  • 有沒有辦法知道從withing委託壓倒一切的CSS設置數據? option.palette似乎並未包含此信息。

我試圖讀取QTreeView則屬性作爲descried here

qDebug() << treeView()->property("background"); 

但控制檯顯示QVariant(Invalid)

我還試圖讀取的Qt源代碼drawControl()drawPrimitive()方法,其中使用在默認的委託實現中,但我設法只能找到小部件選項板引用,並且沒有與CSS覆蓋的連接。

回答

0

閱讀source後,我發現,顯然,默認情況下,代理內部無法訪問CSS數據,因爲CSS解析和計算是由應用程序無法直接訪問的私有QStyleSheetStyle對象處理的。該對象只是簡單修改繪圖程序使用的各個option.palette字段。

然而,有一種方法調用風格的drawPrimitive()方法強制委託得出一些與所需設置的元素,而無需手動解析option.palette領域:

// drawing background with desired colors: 
option.widget->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter); 

此方法將繪製背景相應的設置:

somewhat acceptable

認爲應該有一個類似的方式來強制CSS-修改的設置使用,事中的臺詞:

option.widget->style()->proxy()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter); 

然而,由於缺乏Qt的風格框架的內部工作原理的理解,我無法找到它。

0

正如你在paint方法繪製的組件,可以得出「懸停」效果

您可以使用這樣的事情:

// detect the hover 
QStyleOptionViewItemV4 styleOption(option); 
bool mouseOver = (styleOption.state & QStyle::State_MouseOver); 
// draw if hovered  
if(mouseOver) { 
... 
} 
+0

是的,我真的希望我不需要手動檢測所有需要的狀態。我想我將不得不實施你的解決方案。 – Kef