2009-12-10 46 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

相關問題