以动态方式使用styleSheets是否会增加大量计算

yan*_*nce 7 qt

我有大约40个按钮,它们也是指示灯(开或关),每秒一次我根据状态刷新这些指示灯的颜色.我通过更改样式表来完成此操作.是否过度杀死这样做,如果是这样我应该只在指标改变状态时设置一个新的样式表,还是应该使用像QBrush这样的东西?

Ton*_*vel 11

不要动态设置完整的样式表.相反,使用在应用程序启动时解析一次的动态样式表定义应用程序范围的样式表.然后,在样式表中,定义动态样式表属性,如文档中所述:

在许多情况下,我们需要提供具有必填字段的表单.为了向用户指示该字段是强制性的,一种有效的(尽管是美学上可疑的)解决方案是使用黄色作为那些字段的背景颜色.事实证明,使用Qt样式表很容易实现.首先,我们将使用以下应用程序范围的样式表:

*[mandatoryField="true"] { background-color: yellow }
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你可能会做这样的事情:

QPushButton[state="on"] {
  background-color: green;
}

QPushButton[state="off"] {
  background-color: red;
}
Run Code Online (Sandbox Code Playgroud)

然后更新按钮'state'属性:

pushButton->setProperty("state", "on");
pushButton->setStyle(QApplication::style());
Run Code Online (Sandbox Code Playgroud)

不幸的是,对于Qt 4.6,您需要通过重置窗口小部件的样式来强制重新计算样式表,从而setStyle()调用.

以这种方式使用动态样式表非常快.我正在开发一个大量使用动态样式表属性的应用程序,并没有注意到任何性能降级.


Hea*_*ery 2

是的。我发现在 Linux 上使用 Qt 4.6.2,设置样式表来更改 QLabel 上文本的颜色非常慢。

动态样式表看起来是一个很好的解决方案,但对我来说,必要的setStyle()和昂贵的一样setStyleSheet()

经过多次实验,我发现这种替代方案至少快两倍,通常快 50 倍以上:

QPalette palette = lbl->palette();
palette.setColor(QPalette::WindowText, Qt::gray);
lbl->setPalette(palette);
Run Code Online (Sandbox Code Playgroud)

根据(静态)样式表的设置方式,您必须替换QPalette::WindowTextQPalette::WindowQPalette::Button。有关详细信息,请参阅QPalette 文档