【问题标题】:Are Qt's stylesheets really handling _dynamic_ properties?Qt 的样式表真的处理_dynamic_ 属性吗?
【发布时间】:2010-12-08 09:42:15
【问题描述】:

Qt 的动态属性对样式表来说真的那么动态吗?

我有来自样式表和动态属性的基本示例:

/*stylesheet:*/
*[field_mandatory="true"] { background-color: "yellow";}

我在运行时代码中的某处发生了这种情况:

/*code:*/
myWidget->setProperty("field_mandatory", field->isFilled() );

在运行时更改此属性时,UI 中没有任何变化。

有没有人知道在更改属性时必须做什么来更新 Qt 的样式表引擎,或者它甚至能够处理这类情况?

顺便说一句。我正在使用 Qt 4.4

【问题讨论】:

  • 也许你需要它成为一个 Q_PROPERTY ?

标签: qt stylesheet


【解决方案1】:

我找到了一种快速但有点老套的方法来更新小部件的样式。

myWidget->style()->unpolish(myWidget);
myWidget->ensurePolished();

在更改属性后执行此操作可保持属性数据和 UI 之间的相关性。

【讨论】:

  • 这对 PyQt 4.7.2 (Qt 4.6.2) 对我不起作用,但 Ton van den Heuvel 的建议确实如此。
  • 这对我有用!我正在运行 Qt 4.7,通过QWidget::setEnabled(bool) 更改“启用”属性并没有通过样式表中相应的[enabled="false"][enabled="true"] 部分更改小部件的外观。使用上述方法就像一个魅力。我只是将它们包装在一个 rePolish(QWidget*) 函数中,并在启用状态发生变化时在我的代码中对该函数进行大量调用。
  • 附带说明:谁对上述答案投了反对票……“这对我不起作用”通常不是一个足够好的理由来反对。
  • myWidget->ensurePolished() 可能无法正确应用样式,请改用style()->polish(theWidget)
【解决方案2】:

我也试过这个,没有运气,当我在文档中找到以下文字时,我放弃了。见The Style Sheet Syntax

警告:如果 Qt 的值 样式表后属性更改 已设置,可能需要 强制样式表重新计算。一 实现这一目标的方法是取消设置 样式表并重新设置。

【讨论】:

    【解决方案3】:

    以下内容对我来说可以确保正确重新设置小部件的样式:

    myWidget->setStyle(QApplication::style())

    按照 mdcl 的建议强制重新计算样式表对我不起作用。我正在使用 Qt 4.5.3。

    【讨论】:

    • 这对我使用 PyQt 4.7.2 (Qt 4.6.2) 确实有效。真可惜,这些东西不能很好地工作。您应该能够只调用 ensurePolished() 并完成它。
    【解决方案4】:

    Qt 在其FAQ 中有以下建议:

    style()->unpolish(theWidget);
    style()->polish(theWidget);
    

    他们还说您可以通过执行以下操作重置样式表,但成本更高:

    setStyleSheet(styleSheet());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多