2016-03-15 87 views
2

的活躍色彩在我QListWidget,也有一些項目具有非默認的背景色,我把他們像這樣的定製內部QListWidget類:如何更改(刪除)選擇/ QListWidget

item->setBackgroundColor(qcolor); // item is of type QListWidgetItem* 

那些我設置的非默認顏色被QListWidget的選擇顏色扭曲。看一個例子:

enter image description here

物品threefour都應該是相同的顏色,但它們不是因爲項目four被選擇,並且因此結果色是原始顏色和QListWidget「的總和選擇(活動項目?)顏色。

我的問題是如何編輯或刪除該選擇顏色?

我想在我的QListWidget(在當我想改變該項目的背景色專用插槽):

QPalette pal = this->palette(); 
pal.setColor(QPalette::Highlight, QColor(255,255,255,0)); 
this->setPalette(pal); // updated 

但它並沒有產生任何效果。我究竟做錯了什麼?這是一個正確的變量設置?我是否將其設置在QListWidget或其代表內部?

更新:我嘗試使用樣式表作爲評論/答案指出的,但是,它將不可能用於我的應用程序,因爲我的行中的項目有3個狀態(所以我需要使用三顏色)。例如,對應於三種顏色的3種狀態:活動粉紅色,非活動綠色,其餘爲灰色。使用樣式表時,我無法將自定義屬性(假設爲QListWidget::item[Inactive="true"])設置爲單個QListWidgetItem,但是對於完整的QListWidget,因此它將所有行的顏色設置爲相同的顏色。

樣式表曾嘗試類似的問題here,並沒有工作,因此我使用樣式表作出結論是不是要走的路。

我原本使用的背景變化方法對我的目的很好,但我無法弄清楚如何擺脫添加到背景顏色併產生混合顏色的默認選擇顏色(透明淺藍色)。

+0

你叫*這個 - >調用SetPalette(PAL); *用於高光顏色設置後?另外,你可以嘗試使用樣式表。查看更多類似問題的一般答案http://stackoverflow.com/questions/8417038/qcombobox-drop-down-list-set-selected-item-style –

+0

對不起,但不清楚,但是,我重置調色板。我會看看你提供的例子,謝謝。 – vicrucann

回答

2

我找到了一個合適的解決方案,通過使用委託。所以,沒有必要使用QPalette;對於我的問題樣式表不起作用。當不同的行(QListWidgetQTreeWidget)需要以不同的顏色着色時,這種解決方案也會起作用,這取決於某些狀態。

item->setBackgroundColor(qcolor); // change color slot inside QListWidget class 

爲了定義規則的小部件是如何繪,我重新定義委託::

class Delegate : public QStyledItemDelegate {}; 

然後我重新

關於這一問題所描述的背景顏色設置 - 定義Delegate的方法paint()。在那裏我定義瞭如何繪製我的小部件的每一行。更具體地說,當鼠標懸停在某個項目上,或者該項目處於選定狀態時(這些是我想要避免的淡藍色選擇該行時的條件),我只會調用自定義繪圖。代碼如下所示:

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    if((option.state & QStyle::State_Selected) || (option.state & QStyle::State_MouseOver)) 
    { 
     // get the color to paint with 
     QVariant var = index.model()->data(index, Qt::BackgroundRole); 

     // draw the row and its content 
     painter->fillRect(option.rect, var.value<QColor>()); 
     painter->drawText(option.rect, index.model()->data(index, Qt::DisplayRole).toString()); 
    } 
    else 
     QStyledItemDelegate::paint(painter, option, index); 

    // ... 
} 

當然,不要忘了關聯的QListWidgetDelegate

listWidget->setItemDelegate(new Delegate()); 
2

我想你會更好地使用樣式表來做到這一點。下面是一個例子

QListWidget::item 
{ 
    background: rgb(255,255,255); 
} 
QListWidget::item:selected 
{ 
    background: rgb(128,128,255); 
} 

::item指示QListWidget內的單個項目,而:selected表示QListWidgetItems當前所選。

要獲取特定小部件的自定義背景,可以使用自定義樣式表屬性。在代碼中,呼籲你想要應用自定義樣式的小部件是這樣的:

myList->setProperty("Custom", "true"); 

// Updates the style. 
style->unpolish(myList); 
style->polish(myList); 

然後在你的樣式表,定義風格自定義屬性,像這樣。

QListWidget::item[Custom="true"] 
{ 
    background: rgb(128,255,128); 
} 
+0

「我想你會更好地使用樣式表來做到這一點」 - 這意味着我試圖使用的方法不適合使用?它會有什麼問題?謝謝。 – vicrucann