gpt4 book ai didi

qt - 如何仅覆盖一个属性:value pair in Qt StyleSheet

转载 作者:行者123 更新时间:2023-12-01 16:42:58 37 4
gpt4 key购买 nike

我正在 OSX Mavericks 上编写新手 Qt5 代码,并且只想覆盖给定小部件的样式表的一个属性:值对。

如果我运行以下独立的演示代码:

#include <QApplication>
#include <QMainWindow>
#include <QtGui>
#include <QPushButton>

int
main( int argc, char *argv[] ) {
QApplication app( argc, argv );

QMainWindow* mw = new QMainWindow();

QPushButton* AButton = new QPushButton( "A Button", mw );

mw->show();

return app.exec();
}

我得到了一个带有 Macintosh 风格默认值的漂亮按钮 - 圆角、按下时的标准 OSX 蓝色等:

QPushButton with OSX defaults

但是,如果我将样式表设置为使背景按钮颜色为红色,那么我似乎会在此过程中丢失所有其他 OSX 样式默认值 - 不再有圆角、标准边距等:

#include <QApplication>
#include <QMainWindow>
#include <QtGui>
#include <QPushButton>

int
main( int argc, char *argv[] ) {
QApplication app( argc, argv );

QMainWindow* mw = new QMainWindow();

QPushButton* AButton = new QPushButton( "A Button", mw );

AButton->setStyleSheet("QPushButton { background-color: red; }");

mw->show();

return app.exec();
}

结果如下:

QPushButton style override, with loss of other OSX defaults

如何仅覆盖一个属性:值对,同时保留小部件的其余样式元素,例如在上面的示例中,将背景颜色设置为红色,但保持所有边框圆角、边距等相同?

非常感谢

最佳答案

您在评论中的分析表明,调用QApplication::setStyleSheet()将完全替换当前事件样式是不正确的。您是对的,当前样式已替换为QStyleSheetStyle。但是,QStyleSheetStyle 将其绘图委托(delegate)给原始样式,在您的情况下为 Mac 样式。如果你看source of QStyleSheetStyle ,您会在很多地方看到这一点,即对 baseStyle()->drawControl() 的调用。

这意味着样式表适用于任何样式。现在,它显然不适用于您的情况,那么发生了什么?如果样式表规则无法应用于基本样式,QStyleSheetStyle 将退回到以 Windows 样式进行绘制。这意味着某些样式表规则可以很好地工作,而其他规则将触发回退。您的规则触发了回退。

我认为没有记录哪些规则触发回退。为此,我们需要查看源代码,在本例中为 QStyleSheetStyle::drawControl() 。我们会在那里找到以下内容:

case CE_PushButton:
if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(opt)) {
if (rule.hasDrawable() || rule.hasBox() || rule.hasPosition() || rule.hasPalette() ||
((btn->features & QStyleOptionButton::HasMenu) && hasStyleRule(w, PseudoElement_PushButtonMenuIndicator))) {
ParentStyle::drawControl(ce, opt, p, w);
return;
}
}

ParentSyle 是后备 Windows 样式。您的规则 background-color 使 rule.hasPalette() 返回 true,因此触发回退。

关于qt - 如何仅覆盖一个属性:value pair in Qt StyleSheet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28839907/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com