我正在努力使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项目保持相同的颜色.图像显示了我遇到的问题.
如果我正确理解了这个问题,你想要完全删除突出显示的颜色,这样鼠标光标下的项目只会被虚线框区分.
执行此操作的一种方法如下:我们创建继承自的类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
如此虚线框确定焦点项目,即使使用此委托,鼠标光标指向的项目仍然可见.