如何为可检查的 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;
}
我使用 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;
}