Qt 以动态方式使用样式表会增加大量计算吗

Qt 以动态方式使用样式表会增加大量计算吗,qt,Qt,我有大约40个按钮,它们也是指示灯(开或关),我根据状态每秒刷新一次这些指示灯的颜色。我通过更改样式表来实现这一点。这样做是否过火了?如果是的话,我应该只在指示器改变状态时设置一个新的样式表,还是应该使用QBrush之类的工具?不要动态设置完整的样式表。相反,使用动态样式表定义应用程序范围的样式表,在应用程序启动时对其进行一次解析。然后,在样式表中,定义动态样式表属性,如中所述: 在许多情况下,我们需要呈现一个具有必填字段的表单。为了向用户表明该字段是强制性的,一个有效的解决方案(尽管在美学上可

我有大约40个按钮,它们也是指示灯(开或关),我根据状态每秒刷新一次这些指示灯的颜色。我通过更改样式表来实现这一点。这样做是否过火了?如果是的话,我应该只在指示器改变状态时设置一个新的样式表,还是应该使用QBrush之类的工具?

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

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

*[mandatoryField="true"] { background-color: yellow }
在您的情况下,您可能可以这样做:

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

QPushButton[state="off"] {
  background-color: red;
}
然后更新按钮“状态”属性:

pushButton->setProperty("state", "on");
pushButton->setStyle(QApplication::style());
不幸的是,对于Qt4.6,您需要通过重置小部件的样式来强制重新计算样式表,因此需要调用
setStyle()


以这种方式使用动态样式表非常快。我正在开发一个大量使用动态样式表属性的应用程序,但没有发现任何性能下降。

根据我的经验,样式表消耗了太多的资源,最好尽量避免使用。

是的。我发现在Linux上使用Qt4.6.2时,在QLabel上设置样式表来更改文本颜色的速度非常慢

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

经过多次实验,我发现这个替代方案的速度至少是原来的两倍,通常是原来的50倍多:

QPalette palette = lbl->palette();
palette.setColor(QPalette::WindowText, Qt::gray);
lbl->setPalette(palette);

根据(静态)样式表的设置方式,您必须将
qpalete::WindowText
替换为
qpalete::Window
qpalete::Button
。有关详细信息,请参阅。

如果您使用O/S性能监视器(
perfmon.exe,Windows上)来测量CPU计算量,它不会回答您的问题吗?谢谢您的回答。因此,从Qt4.6开始,我将不得不调用butdown->setStyle(QApplication::style());每次我更改属性以影响样式时?为了避免将来出现问题,我将立即将其放在代码中。您是否绝对确定Qt 4.6中会出现这种情况?我没有在不重置样式的情况下成功地使动态行为正常工作。还可以看到这个问题:您是否在不重置小部件样式的情况下获得了动态行为?我在Linux下使用Qt,不确定这是否有什么不同。只是优化了如何在不完全重置样式的情况下进行更新(从:tstFrame->setProperty(“error”,true);tstFrame->style()->未抛光(tstFrame);tstFrame->style()->抛光(tstFrame);tstFrame->update()@TonvandenHeuvel:好方法!我发现setStyle(QApplication::style())比Unprolish和polish(或EnsureRepolished)方法更好。我有一个应用程序,需要使用循环设置大约50个按钮的颜色。对于未抛光的抛光功能,通常第一个按钮会产生问题,因为它的颜色没有得到更新;不知道为什么。但是用你的方法,效果很好!谢谢这是一个很酷的概念。不幸的是,他们明确提到它是“仅用于演示目的”,不应该“用于生产”(尽管我确实使用过它:)bump。不尊重之前的回答:)@yanbellavance,你有没有一个链接,他们提到它“仅供演示使用”和“不应用于生产?刷新率为每秒一次,我的应用程序运行的四核pc非常平滑,运行速度为0%:)