Qt5 - 设置QPushButton和QCheckBox的背景颜色

24
我想改变Qt5中QAbstractButton(QPushButton或QCheckBox)的背景颜色,但是一直没有成功。
这个代码什么也没做:
pButton->setAutoFillBackground(true);
QPalette palette = pButton->palette();
palette.setColor(QPalette::Window, QColor(Qt::blue));
pButton->setPalette(palette);
pButton->show();

如果我尝试更改样式表:

pButton->setStyleSheet("background-color: rgb(255,255,0);");

然后Qt无可奈何,只能绘制一个看起来很难看的方块状按钮。

有一页标题为“如何更改QWidget的背景颜色”,但它只谈到了这两种方法。

还有一页“Qt样式表示例”,它暗示如果您想更改背景颜色,必须接管绘制按钮的所有方面,这似乎就是过度设计。

我需要在Mac、Windows和Ubuntu Linux上运行,如果我必须手动三次绘制关于按钮的所有内容(每个平台一次),那将会是非常不愉快的事情。

我是否错过了明显的东西?

附言:通过“背景颜色”,我指的是按钮周围的区域,而不是按钮正面文字下方的颜色。


1
你解决了这个问题吗? - Alchete
1
我没有...似乎如果您使用默认小部件,Qt会使用QStyle“绘制”它们,这很好,因为您的小部件在所有不同的平台上都显示为本地,但这并不好,因为无法进行自定义。您可能能够创建自己的QStyle派生类,并以某种方式依附于QStyle本身,但我们决定通过完全不同的方式处理我们的UI,绕过此限制。 - Betty Crokker
7个回答

24

我曾面临同样的问题,但最终解决了。我正在使用带有Fusion颜色主题的Qt 5:

QPalette pal = button->palette();
pal.setColor(QPalette::Button, QColor(Qt::blue));
button->setAutoFillBackground(true);
button->setPalette(pal);
button->update();

按照上述确切顺序尝试这些命令,如果仍然不起作用,请将主题设置为Fusion,然后再次尝试。

祝你好运!


我已经在Linux和Mac上尝试过了。很奇怪,我正在使用RGB QColor,在Linux上它确实改变了颜色,但不是指定的颜色,在Mac上则根本没有改变。我已按照上述命令顺序尝试过了。 - Lightbulb1
6
如果您在按钮上调用setFlat(true),它将按照我期望的方式响应。但对于其他人来说,这可能不是一个理想的结果。 - Lightbulb1
1
在PyQt中,它像是设置了背景,但按钮却绘制在背景之上,导致出现非常奇怪的效果。 - Brighter side

15

将属性border:none;添加到样式表中

由于某种原因,这也会删除默认的背景颜色。

示例:background-color: rgba(46, 204, 113, 0.4); border: none;


4
三年后,我在使用Qt 5.8和Windows 8时遇到了相同的问题。尽管这是一种奇怪的行为,但这个方法解决了我的问题。 - Phiber
这种方法对我来说最简单,在使用Windows 7的Qt 5.12.4创建者中有效。非常奇怪! - cmaceachern

14

试试这个:

QColor col = QColor(Qt::blue);
if(col.isValid()) {
   QString qss = QString("background-color: %1").arg(col.name());
   button->setStyleSheet(qss);
}

如@goetz在QT论坛中提到。

我使用了一些不同的QColor col的定义,例如QColor col = QColor::fromRgb(144,238,144);,这对我有效。


11

将对话框的styleSheet属性更改对我很有效,将此属性设置为:

QPushButton:pressed {
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,   stop:0 rgba(60, 186, 162, 255), stop:1 rgba(98, 211, 162, 255))
}
QPushButton {
     background-color: #3cbaa2; border: 1px solid black;
     border-radius: 5px;
}

QPushButton:disabled {
    background-color: rgb(170, 170, 127)
}

在此输入图片描述


你好,我有一个名为myButtonQPushButton,但是无论是myButton->pressed {还是myButton { backgroud-color ...都不起作用!请问如何在示例中使用这些功能来处理QPushbutton - Franky
你应该在styleSheet属性中使用#myButton:pressed {或#myButton {。 - kato2

5

我发现了一个愚蠢的方法,尝试了调色板中的每个属性,当我改变 'QPalette::Base' 时它对我起作用。也许你可以试试。

    pButton->setAutoFillBackground(true);
    QPalette palette = pButton->palette();
    //palette.setColor(QPalette::Window, QColor(Qt.blue));
    //palette.setColor(QPalette::Foreground, QColor(Qt.blue));
    palette.setColor(QPalette::Base, QColor(Qt.blue));
    //palette.setColor(QPalette::AlternateBase, QColor(Qt.blue));
    //palette.setColor(QPalette::ToolTipBase, QColor(Qt.blue));
    //palette.setColor(QPalette::ToolTipText, QColor(Qt.blue));
    //palette.setColor(QPalette::Text, QColor(Qt.blue));
    //palette.setColor(QPalette::Button, QColor(Qt.blue));
    //palette.setColor(QPalette::ButtonText, QColor(Qt.blue));
    //palette.setColor(QPalette::BrightText, QColor(Qt.blue));
    pButton->setPalette(palette);
    pButton->show();

参考链接:如何获取样式表属性?


0

我想要切换按钮的颜色,开/关。

这对我有用...

 QPalette pal = ui->pushButton->palette();
 if (bIn)
    pal.setColor(QPalette::Button, QColor(Qt::green));
 else
    pal.setColor(QPalette::Button, QColor(Qt::red));
  ui->pushButton->setPalette(pal);
  ui->pushButton->setAutoFillBackground(true);
 ui->pushButton->repaint();

我在点击信号/槽时翻转bIn的值。

void BtnFrame::on_pushButton_clicked()
{
    if (bIn)
        bIn=false;
    else
        bIn=true;
    setColor();
}

0

我曾经也遇到过同样的问题。你需要选择QPalette::Button而不是QPalette::Window。Qt参考文档中这样写道:QPaletteButton - 一般按钮的背景颜色。由于某些样式需要为按钮提供不同的背景颜色,因此该背景可能与窗口不同。 所以我是这样解决的:

        QPalette pal=this->palette(); \\"this" is my derived button class
        pal.setColor(QPalette::Window, style.background);
        QColor col=style.background; \\ my style wrapper, returns QColor
        this->setAutoFillBackground(true);
        this->setPalette(pal);

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