【问题标题】:How to add style via setStyleSheet() without losing orignal style in Qt?如何通过 setStyleSheet() 添加样式而不丢失 Qt 中的原始样式?
【发布时间】:2014-06-22 18:58:15
【问题描述】:

我知道我可以使用 setStyleSheet() 在 Qt 中设置样式。但是我遇到了一个问题,当我使用 setStyleSheet() 两次时,第一个样式丢失了,它们是通过第一次使用 setStyleSheet() 设置。

例如

setStyleSheet("QLabel{color:red;}");

…………

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

当我设置border-image时,红色属性丢失。

我尝试通过使用来解决它

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

但同样只有border-image属性存在。

我在使用 setStyleSheet() 时必须添加每个样式属性,尽管我之前设置过。

感谢您忍受我糟糕的英语写作。任何提示将不胜感激。

【问题讨论】:

    标签: qt qtstylesheets


    【解决方案1】:

    第二个条目使用双列。

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

    【讨论】:

      【解决方案2】:

      这是对您对已接受答案的评论的回应。

      您可以通过将常量值设置为父级来防止覆盖样式表属性(允许父级的样式也不会被动态更改)。仅将您使用 C++ 更改的值设置为子项。

      parentWidget->setStyleSheet( "QLabel#yourLabel { color:red; }" );
      yourLabel->setStyleSheet( "QLabel { border-image:url(...) };" );
      

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

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

      【讨论】:

      • 这在使用 Qt Designer 时也适用。当必须通过代码更改小部件时,我个人对样式的偏好是将 Qt Designer 中的常量值设置为具有相应小部件类型标签和对象名称标签的父级。只需使用第二行代码设置给child,之前的属性不会丢失。
      • 感谢您这么久的回答。设置代码样式是一个很好的规则。
      • 我自己试图找到一个优雅的解决方案,偶然发现了你的问题。我看到您在几个月前的几年后再次发表评论,所以我想为可能遇到相同情况的其他人添加一个替代解决方案。干杯
      【解决方案3】:

      您可以设置不带 QLabel 标签的样式表:

      setStyleSheet("color:red;");
      

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

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

      【讨论】:

      • 但是当我必须使用像QPushButton:pressed{} 这样的样式时它不起作用。有没有更好的方法来解决?
      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      相关资源
      最近更新 更多