2009-12-10 50 views
5

我有大约40个按钮,也是指标(开或关),每一次我刷新这些指标的颜色取决于状态。我通过更改样式表来做到这一点。这样做是否已经结束了?如果是这样,我应该只在指标改变状态时设置新的样式表,还是应该使用QBrush之类的东西?是否以动态的方式使用styleSheets增加了大量的计算

+2

如果您使用O/S性能监视器(Windows上的'perfmon.exe')来测量CPU计算量,它会不会回答您的问题? – ChrisW 2009-12-10 19:20:29

回答

1

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

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

多次试验后,我发现这种替代是一样快,而且通常一样快50倍以上,至少两次:

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

根据您的(静态)样式表是如何设置的,你” d必须用QPalette::WindowQPalette::Button代替QPalette::WindowText。有关详细信息,请参见QPalette documentation

+0

这是一个很酷的概念。不幸的是,他们明确提到它仅用于“演示目的”,并且“不能用于生产”(尽管我确实使用它:) – 2017-07-15 07:27:17

+0

凹凸。没有不尊重以前的答案:) – 2017-07-15 07:32:58

+0

@yanbellavance,你有一个链接,他们提到它是'仅用于演示目的'和'不应该用于生产? – 2017-07-17 06:23:20

10

不要动态设置完整的样式表。相反,使用在应用程序启动时解析一次的动态样式表定义应用程序范围的样式表。然后,在样式表,定义为在documentation详细的动态特性的样式表:

在有些情况下,我们需要提出的是具有强制性的字段的表格很多情况下。为了向用户表明该字段是强制性的,一个有效的(尽管美观可疑)解决方案是使用黄色作为这些字段的背景颜色。事实证明,使用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()); 

不幸的是,Qt的4.6则需要通过重置控件的样式,因此,0123给力的样式表的重新计算致电。

以这种方式使用动态样式表非常快。我正在研究大量使用动态样式表属性并且没有注意到任何性能降级的应用程序。

+0

感谢您的好评。所以从Qt 4.6我将不得不调用pushButton-> setStyle(QApplication :: style());每次我改变属性来影响样式?我现在将它放在我的代码中以避免将来出现问题。 – 2009-12-11 17:38:48

+0

你是否确定这将是Qt 4.6的情况? – 2009-12-11 18:29:19

+0

我没有设法让动态行为在不重置样式的情况下工作。另请参阅此问题:http:// stackoverflow。com/questions/1595476/are-qts-stylesheets-really-handling-dynamic-properties/1849127#1849127 您是否设法在不重置小部件样式的情况下获得动态行为?我在Linux下使用Qt,不知道这是否有任何区别。 – 2009-12-11 19:01:58

1

根据我的经验,样式表会消耗太多资源,如果可以的话,最好避免它们。

+3

什么太多? – 2013-06-10 13:24:15

+0

刷新率是每秒一次,我的应用程序正在运行的四核心PC是如此平稳,它运行在0%:) – 2017-07-15 07:29:43

相关问题