我使用C ++,Qt 4.8.7,Visual Studio来创建基于GUI的应用程序。我必须添加一些可检查的按钮,其中包含带字幕的字幕。我使用来自github的第三方按钮,请参见richtextpushbutton.hrichtextpushbutton.cpp。选中的QPushButton的默认外观看起来很糟(不可读),我想在选中状态下更改其背景。我如何更改以下方法,以便为选中状态覆盖此HTML支持按钮的背景色(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;
}

最佳答案

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


  QStyle :: State_Off 0x00000008用于指示窗口小部件是否不是
  检查。
  
  QStyle :: State_On 0x00000020用于指示小部件是否为
  检查。


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

RichTextPushButton:checked {
    background-color: red;
}


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

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

07-28 01:33
查看更多