我使用C ++,Qt 4.8.7,Visual Studio来创建基于GUI的应用程序。我必须添加一些可检查的按钮,其中包含带字幕的字幕。我使用来自github的第三方按钮,请参见richtextpushbutton.h和richtextpushbutton.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;
}