如何在Qt中通过setStyleSheet()添加样式而不丢失原始样式?

15

我知道我可以使用 setStyleSheet() 在Qt中设置样式。但是当我两次使用 setStyleSheet() 时,第一次使用 setStyleSheet() 设置的样式会丢失。

例如,

setStyleSheet("QLabel{color:red;}");
setStyleSheet("QLabel{border-image:url(……)}")

当我设置边框图像时,红色属性丢失了。

我尝试通过以下方式解决:

setStyleSheet(styleSheet()+QString("QLabel{border-image:url(……)}"));

但是事实上只有border-image属性存在。

当我使用setStyleSheet()时,是否必须添加每个样式属性,即使我之前已经设置过了。

有没有一种方法可以在不覆盖先前样式的情况下应用它两次?

3个回答

17

您可以在没有QLabel标签的情况下设置样式表:

setStyleSheet("color:red;");

设置一个样式表属性后,您可以添加另一个属性,例如:

setStyleSheet( styleSheet().append(QString("border-image:url(……);")) );

但是当我必须使用QPushButton:pressed{}这样的样式时,它就不起作用了。有更好的方法来解决吗? - waterd

11
这是针对您对已接受答案的评论的回复。
您可以通过将常量值设置为父级来防止覆盖样式表属性(前提是父级样式没有被动态更改)。只将您用C ++更改的值设置为子项。
parentWidget->setStyleSheet( "QLabel#yourLabel { color:red; }" );
yourLabel->setStyleSheet( "QLabel { border-image:url(...) };" );

这将保留小部件上设置的所有父级属性,当您更改小部件的样式表时。

此外,这消除了一个非常大的字符串的情况,这在接受的答案中是可能的。频繁更改将低效地将字符串附加到以前定义的不会使用的样式。


这也适用于使用Qt Designer的情况。当小部件必须通过代码更改时,我个人偏好的样式是在Qt Designer中将常量值设置为具有相应小部件类型标记和对象名称标记的父级。只需使用第二行代码设置到子级,之前的属性就不会丢失。 - user732784
感谢您这么长时间后的回答。代码样式化是一个好习惯。 - waterd
我曾试图自己找到一个优雅的解决方案,偶然发现了你的问题。我看到你在几年后又评论了一次,所以我想为其他可能遇到同样情况的人添加另一种解决方案。干杯! - user732784

0

通过在第二个条目中使用双列。

ui->pushButton_2->setStyleSheet(
            "QPushButton{background-color:red;color:white}\
             QPushButton::hover{color:black}");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接