【问题标题】:Qt how to change the highlight color of a specific QComboBox itemQt如何更改特定QComboBox项目的突出显示颜色
【发布时间】:2014-02-21 19:10:46
【问题描述】:

我正在尝试使 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 项目保持相同的颜色。图片显示了我遇到的问题。

【问题讨论】:

  • 我没有完全理解你的问题,你能告诉项目“没有变化”、“关闭”和“打开”应该是什么颜色以及它们现在是什么(或者为什么你的图像是错误的) ?
  • 关闭应该是红色的。 On 应该是绿色,No change 应该是默认颜色。高亮颜色设置为透明。这适用于组合框,但是当您在组合框中选择项目时,“透明”不会给我我希望的结果。您可以在图像中看到 QAbstractItemView 中的选定项目始终为红色。

标签: qt qcombobox


【解决方案1】:

如果我正确理解了这个问题,您希望完全删除突出显示的颜色,以便鼠标光标下的项目只能通过虚线框来区分。

这样做的一种方法如下:我们创建从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_SelectedQItemDelegate::paint 内的几个函数正在检查它,最重要的是drawBackground,可悲的是它不是虚拟的。

当我们只是使用comboBox->setItemDelegate (new SelectionKillerDelegate) 来使我们的委托被使用而不是简单的QItemDelegate 时。就是这样。

好消息是焦点项目是使用QStyle::State_HasFocus 确定的,因此即使使用此委托,鼠标光标指向的项目的虚线框仍然可见。

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 2014-11-18
    • 2011-03-05
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多