动态更改样式表

时间:2014-03-21 15:19:37

标签: qt qtstylesheets

我正在尝试使用动态属性更改QLabel的样式,因为我们可以在QSS中定位此属性,如下所示:

QLabel[foo = "warning"]{ color: red; }
QLabel[foo = "success"]{ color: green; }

当我使用QApplication::setStyleSheet()时,我的标签的stye会更新,但在我更改属性的值时似乎不起作用。

label = new QLabel( this );
label->setText( "some text" );
label->setProperty( "foo", "warning");

// after some event
label->setProperty( "foo", "success" );
// the label's color should be green now

我错过了什么,或者样式改变不能这样做吗?。

2 个答案:

答案 0 :(得分:10)

无论我们在哪里更改属性,我们都需要添加以下代码来触发更新

label->setProperty("foo", "success");
label->style()->unpolish(label);
label->style()->polish(label);
label->update();

http://qt-project.org/wiki/DynamicPropertiesAndStylesheets

答案 1 :(得分:0)

今天在PyQT中遇到同样的问题。在SO上找到的建议都没有奏效,但最终的工作是使用样式表的级联性质。在我的应用程序中,我有一个应用程序范围的样式表,它可以在checked时对按钮进行不同的样式设置:

QToolButton {
    background-color: #12313F;
    background: #12313F;
    color: #DEE8EC;
    spacing: 0px;
    border: none
}

QToolButton[checked="true"] {
    background-color: #5B8AA1;
    background: #5B8AA1;
}

这被设置为主样式表,这是python但希望它能得到这个想法(我正在从style.css中将样式表作为字符串阅读):

mainwindow.setStyleSheet(
    pkg_resources.resource_stream(__name__, 'style.css').read())

在我的代码中,工具栏的QAction子项的checked属性可能会更改,然后我希望工具栏更新并突出显示该按钮。

为了完成这个(花了很多试验和错误),我覆盖了工具栏对象的样式表,它是主窗口的子代。事实证明我甚至不需要设置任何东西,空字符串就足够了:

toolbar.setStyleSheet("")

Et Voila,工具栏呈现正确。 QT 4.8。 YMMV用C ++编写,但希望它有效。