如何设置QComboBox按钮的背景颜色?

时间:2019-01-12 14:01:55

标签: c++ qt windows-10 qt5 qtstylesheets

版本/环境:

  • Windows 10 64位
  • Qt 5.11.0 MSVC2017 64位

我有一个简单的QComboBox来启用/禁用功能:

QComboBox *onOffComboBox = new QComboBox();
onOffComboBox->insertItem(0, "Off");
onOffComboBox->insertItem(1, "On");

组合框作为单元格小部件添加到表中:

this->ui->settingsTable->setCellWidget(rowNumber, 1, onOffComboBox);

enter image description here

现在我想更改按钮的背景颜色,而不是选择项目。

我的第一种方法是简单地使用QWidget的{​​{3}}函数:

onOffComboBox->setStyleSheet("background-color: red;");

但这会抑制标准样式:

setStyleSheet

我还根据文档使用了带有特定enter image description here的版本:

onOffComboBox->setStyleSheet("QComboBox::drop-down {background: red;}");

但这只会用箭头为零件上色并取消其样式:

QComboBox styles

仅使用QComboBox {background: red;}background-color: red;的结果相同,只是所选项目没有颜色。

正如enter image description here中所述,回答另一种方法是使用QPallete

QPalette pal = onOffComboBox->palette();
pal.setColor(QPalette::Base, QColor("red"));
onOffComboBox->setPalette(pal);
onOffComboBox->update(); // just in case this has any effect

这只会为选定的项目着色:

this

我也尝试了几乎所有其他QPalette enter image description here

  • QPalette::WindowQPalette::ForegroundQPalette::Button-不执行任何操作
  • QPalette::Base-为所选项目着色(请参见图片)
  • QPalette::Text-为按钮和选择项的文本上色

那么,如何在不覆盖或抑制标准样式的情况下更改QComboBox下拉按钮背景的颜色?

弹出菜单的样式也不应更改。

这是我想要的图像:

color roles

1 个答案:

答案 0 :(得分:1)

QComboBox总是很难定制,因为它是由子控件(甚至是条件子控件)组成的。
我进行了测试,您简单的样式表QComboBox {background:red}在Linux上对我来说几乎可以用,除了下拉菜单中的边框也为红色。根据{{​​3}},行为似乎有所不同。

来自GUI style

  

注意:如果使用复杂的小部件(例如QComboBox和QScrollBar),则为   属性或子控件是自定义的,所有其他属性或   子控件也必须自定义。

如果要自定义按钮,则似乎必须自定义所有内容...这样就无法在不覆盖或抑制标准样式的情况下更改颜色。

您可以设置整个下拉列表的样式以模仿本机外观,但这并不好做且不够健壮(并且不便于移植)。

QComboBox QAbstractItemView {
  border: 1px solid grey;
  background: white;
  selection-background-color: blue;
}
QComboBox {
  background: red;
}