问:如何更改特定QComboBox项目的突出显示颜色

时间:2014-01-29 19:06:08

标签: qt qcombobox

我正在努力使QComboBox的高亮显示透明。此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 here enter image description here enter image description here

1 个答案:

答案 0 :(得分:5)

如果我正确理解了这个问题,你想要完全删除突出显示的颜色,这样鼠标光标下的项目只会被虚线框区分。

执行此操作的一种方法如下:我们创建继承自QItemDelegate的类(通常简单QItemDelegate负责绘制QComboBox项目)。我们覆盖paint函数,如下所示:

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时。就是这样。

好处是聚焦项目是使用{{1}}确定的,因此即使使用此代理,鼠标光标指向的项目的虚线框仍然可见。