2014-01-29 2 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

Выкл должен быть красным. Вкл. Должен быть зеленым, и никакие изменения не должны быть по умолчанию. Цвет подсветки установлен на прозрачный. Это работает для combobox, но когда вы выбираете элементы в combobox, «прозрачный» не дает мне результатов, на которые я надеюсь. Вы можете видеть на изображениях выбранный элемент из QAbstractItemView всегда красный. –

ответ

4

Если я правильно понял вопрос правильно, вы хотите, чтобы полностью удалить выделенный цвет, так что элемент под курсором мыши будет отличать только пунктирной рамкой.

Один из способов сделать это состоит в следующем: мы создаем класс, унаследованный от 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

Отлично! Прекрасно работает! –