如何为可检查的 QPushButton 后代更改背景颜色?

How can background color be changed for checkable QPushButton descendant?

我使用 C++、Qt 4.8.7、Visual Studio 来创建 GUI-based 应用程序。我必须添加一些可检查的按钮,其中包含带下标的标题。我使用来自 github 的第 3 方按钮,参见 richtextpushbutton.h and richtextpushbutton.cpp。 checked QPushButton 的默认外观看起来很糟糕(不可读),我想在 checked 状态下更改它的背景。如何更改以下方法以覆盖选中状态下此 HTML-supporting 按钮的背景颜色(当 isRichText 为 true 和 false 时)?我只遇到过简单 QPushButton 后代的例子(没有 QTextDocument)。

void RichTextPushButton::paintEvent(QPaintEvent *event)
{
   if (isRichText) {
    QStylePainter p(this);

    QRect buttonRect = rect();
    QPoint point;

    QTextDocument richTextLabel;
    richTextLabel.setHtml(htmlText);

    QPixmap richTextPixmap(richTextLabel.size().width(), richTextLabel.size().height());
    richTextPixmap.fill(Qt::transparent);
    QPainter richTextPainter(&richTextPixmap);
    richTextLabel.drawContents(&richTextPainter, richTextPixmap.rect());

    if (!icon().isNull())
        point = QPoint(buttonRect.x() + buttonRect.width() / 2 + iconSize().width() / 2 + 2, buttonRect.y() + buttonRect.height() / 2);
    else
        point = QPoint(buttonRect.x() + buttonRect.width() / 2 - 1, buttonRect.y() + buttonRect.height() / 2);

    buttonRect.translate(point.x() - richTextPixmap.width() / 2, point.y() - richTextPixmap.height() / 2);

    p.drawControl(QStyle::CE_PushButton, getStyleOption());
    p.drawPixmap(buttonRect.left(), buttonRect.top(), richTextPixmap.width(), richTextPixmap.height(),richTextPixmap);
} else
    QPushButton::paintEvent(event);
}

QStyleOptionButton RichTextPushButton::getStyleOption() const
{
QStyleOptionButton opt;
opt.initFrom(this);
opt.features = QStyleOptionButton::None;
if (isFlat())
    opt.features |= QStyleOptionButton::Flat;
if (menu())
    opt.features |= QStyleOptionButton::HasMenu;
if (autoDefault() || isDefault())
    opt.features |= QStyleOptionButton::AutoDefaultButton;
if (isDefault())
    opt.features |= QStyleOptionButton::DefaultButton;
if (isDown() || (menu() && menu()->isVisible()))
    opt.state |= QStyle::State_Sunken;
if (isChecked())
    opt.state |= QStyle::State_On;
if (!isFlat() && !isDown())
    opt.state |= QStyle::State_Raised;
if (!isRichText)
    opt.text = QPushButton::text();
opt.icon = icon();
opt.iconSize = iconSize();
return opt;
}

The default look of the checked QPushButton looks awful

这就是 Qt 多年前引入样式表的原因。 Check this out.

要更改按下按钮的背景颜色,只需执行以下操作:

void MyClass::slotToggleButton(bool enable)
{
    m_pushButton->setStyleSheet(enable ? "background: green;" : "");
}

方法是使用样式表。正如您在 getStyleOption() 中看到的,状态 QStyle::State_On 在选中对应于 :on 伪状态的按钮时设置。在按钮的情况下,伪状态 :checked 也可能适用。

QStyle::State_Off 0x00000008 Used to indicate if the widget is not checked.

QStyle::State_On 0x00000020 Used to indicate if the widget is checked.

因此您的样式表可能如下所示:

RichTextPushButton:checked {
    background-color: red;
}

如果您的 isRichText 变量是动态的 属性 (QObject::属性) 您可以进一步限制您的样式表:

RichTextPushButton[isRichText="true"]:checked {
    background-color: red;
}