如何设置像组合框或双向微调框这样的窗口部件的背景颜色?

39

我想要设置一个双精度旋转框的背景颜色,但不确定应该使用哪个函数。

我看到了一些名为SetBackgroundRole的函数,它接受一个Qt::ColorRole参数,但我也不确定如何使用它。

请告诉我,有什么简单的方法可以改变QComboBoxQDoubleSpinBox的背景颜色吗?

9个回答

46

fhe是基本正确的,但没有考虑到在调色板中使用不同背景角色的小部件(如旋转框和按钮/组合框)。一个更通用的解决方案可能是这样的:

QPalette pal = widget.palette();
pal.setColor(widget.backgroundRole(), Qt::blue);
widget.setPalette(pal);

或者,您可以查看各种调色板角色的描述,并找出您想要的角色,然后将其应用于包含其他要更改的小部件的小部件。 调色板更改应该传播到子小部件。


42

使用 QPalette 并不能保证所有样式都能正常工作,因为样式作者受不同平台指南和本地主题引擎的限制。

为确保您的背景颜色正确,建议使用 Qt 样式表。以下是我用来更改 QComboBox 背景颜色的方法:

myComboBox->setStyleSheet("QComboBox { background-color: blue; }");

我没有专门尝试过 QSpinBox,但我想它应该也是一样的!


8
除非你也打算对QComboBox的其他子控件(即下拉菜单和向下箭头)进行样式设置,否则仅使用样式表设置背景颜色并不是正确的方法。请参考Qt文档中的说明:“对于像QComboBox和QScrollBar这样的复杂小部件,如果自定义一个属性或子控件,则必须同时自定义所有其他属性或子控件。” 链接:http://doc.trolltech.com/4.5/stylesheet-customizing.html - Krsna
我在Mac上的圆角处顶部和底部出现了白色边框。 - tofutim

14

实际上,如果你查看Qt文档中的QPalette,在QComboBox的情况下,背景角色可能不是你想要的。你需要的是:

QPalette::Base 主要用作文本输入部件的背景颜色,但也可用于其他绘制,例如组合框下拉列表和工具栏手柄的背景。它通常是白色或其他浅色。

因此,这里是我使用的代码,用于设置组合框的背景颜色,使其与所在的窗口小部件的颜色匹配:

QPalette pal = myComboBox->palette();
pal.setColor(QPalette::Base, pal.color(QPalette::Window));
myComboBox->setPalette(pal);

11

在Qt 4.1及以上版本中,显然需要设置this->setAutoFillBackground( true );以应用背景颜色的调色板。


1
这应该是一个注释 - brettmichaelgreen

4

虽然之前的答案可以为不可编辑的QComboBox设置背景颜色,但对于可编辑的QComboBox并不起作用。对于这种情况,您需要派生用于编辑的QLineEdit小部件并重置其背景。

以下是我实现的方法:

    QComboBox *myComboBox = new QComboBox();
    myComboBox->setEditable(true);
    QColor backColor = QColor(246, 230, 230);
    QLineEdit *lineEditor = myComboBox->lineEdit();
    QPalette pal = lineEditor->palette();
    pal.setColor(QPalette::Base, backColor);
    lineEditor->setPalette(pal);

3

构建一个无论小部件实际颜色如何都是蓝色的调色板:

comboBox->setPalette( QPalette( Qt::blue ) );

1

之前的答案对我都不起作用,但我将所有回复混合在一起,最终在Qt 5.12上实现了:

QPalette pal = ui.widget->palette();
pal.setColor(QPalette::Base, Qt::red);
ui.widget->setPalette(pal);

不错的回答!另一个很酷、更微妙的高亮效果是使用 QPalette::Background 而不是 QPalette::Base,但要选择深色,如品红色或绿色。 - psimpson

0
我会尝试类似这样的东西
QPalette pal = widget.palette();
pal.setColor(QPalette::Window, Qt::blue);
widget.setPalette(pal);

1
我尝试过这样做,但是背景颜色似乎没有更新。你有什么想法是什么原因吗?还有其他你假设的东西吗? - AMM
我的意思是,在执行setPalette之后,我是否应该调用类似于repaint或其他任何操作? - AMM
我这里没有QT进行测试,但是QWidget::update()应该会强制重绘。你试过Jérôme的解决方案了吗? - fhe
QPalette::Window 不是 QComboBoxbackgroundRole(),因此这段代码对于 QComboBox 没有任何作用。 - Marc Mutz - mmutz

-1
comboBox->setPalette( QPalette( Qt::blue ) );

对我来说运行良好!


1
我尝试过这个,但只有在QSpinBox被禁用时才有效(即如果启用了QSpinBox,则颜色会恢复正常)。有什么想法吗? - ismailsunni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接