2014-01-29 68 views
4

我正在嘗試使突出顯示爲QComboBox透明。此QComboBox的顏色也會根據所選索引進行更改。這是我最好的解決方案迄今:Qt如何更改特定QComboBox項目的突出顯示顏色

switch(comboBox->currentIndex()) 
{ 
case 0: 
    comboBox->setStyleSheet("QWidget {color:black}"); 
    break; 

case 1: 
    comboBox->setStyleSheet("QWidget {background-color:red; color:white;}"); 
    break; 

case 2: 
    comboBox->setStyleSheet("QWidget {background-color:green; color:white;}"); 
    break; 
} 


comboBox->setItemData(0, QColor(Qt::white), Qt::BackgroundRole); 
comboBox->setItemData(0, QColor(Qt::black), Qt::ForegroundRole); 
comboBox->setItemData(1, QColor(Qt::red), Qt::BackgroundRole); 
comboBox->setItemData(1, QColor(Qt::white), Qt::ForegroundRole); 
comboBox->setItemData(2, QColor(Qt::darkGreen), Qt::BackgroundRole); 
comboBox->setItemData(2, QColor(Qt::white), Qt::ForegroundRole); 

QPalette p = comboBox->palette(); 
p.setColor(QPalette::Highlight, Qt::transparent); 
comboBox->setPalette(p); 

p = comboBox->view()->palette(); 
p.setColor(QPalette::Highlight, Qt::transparent); 

comboBox->view()->setPalette(p); 

的問題是,任何顏色的QComboBox目前在彈出的選擇項目時的高亮顏色將是什麼。我希望每個QComboBox項目保持相同的顏色。圖像顯示我遇到的問題。

enter image description hereenter image description hereenter image description here

+0

我完全不理解你的問題,你能告訴什麼顏色的項目「沒有改變」,「關」,「開」應該是什麼,他們現在是什麼(或爲什麼你的圖像是錯的)? –

+0

關閉應該是紅色的。 On應該是綠色的,並且沒有改變應該是默認顏色。高亮顏色設置爲透明。這適用於組合框,但是當您在組合框中選擇項目時,「透明」不會給我所期望的結果。您可以在圖像中看到QAbstractItemView中的選定項目始終爲紅色。 –

回答

4

如果我理解正確的問題,你要完全刪除高亮顏色,所以在鼠標光標的項目將僅由虛線框來區分。

執行此操作的一種方法如下:我們創建從QItemDelegate繼承的類(通常簡單QItemDelegate負責繪製QComboBox項目)。我們覆蓋的塗料功能是這樣的:

class SelectionKillerDelegate : public QItemDelegate 
{ 
    virtual void paint(QPainter *painter, 
     const QStyleOptionViewItem &option, 
     const QModelIndex &index) const override 
    { 
     QStyleOptionViewItem myOption = option; 
     myOption.state &= (~QStyle::State_Selected); 
     QItemDelegate::paint (painter, myOption, index); 
    } 
}; 

基本上我們只是使用普通的塗料功能的功能,但假裝所有的項目沒有QStyle::State_Selected正在被檢查的幾個函數中QItemDelegate::paint,最重要的是drawBackground其中可悲不是虛擬的。

當我們只是使用comboBox->setItemDelegate (new SelectionKillerDelegate)來使我們的代表被使用,而不是簡單QItemDelegate。就這樣。

好的一點是,使用QStyle::State_HasFocus確定焦點項目,即使使用此代理,鼠標光標指向的項目的虛線框仍然可見。

+0

完美!很棒! –

相關問題