2014-09-29 185 views
1

設置我Qt創建了一個按鈕,並賦予它QSS屬性background-color: gray;,而我的外部樣式表設定了相同的按鈕的QSS屬性background-color: blue;。當我運行應用程序的按鈕是灰色的,即使樣式表的QWidget::show()後應用被調用,之前QApplication::exec(),如下圖所示:使用的QApplication :: setStyleSheet覆蓋QSS屬性在Qt的

MyWidget w; 
w.show(); 
... 
app.setStyleSheet("..."); // contents of external stylesheet 
return app.exec();  

是否有QApplication::setStyleSheet()覆蓋QSS屬性可能分配給Qt中的Widget。

+0

你的按鈕應該是藍色的,因爲應用程序。setStyleSheet應該重新設計小部件,可以顯示完整的樣式表嗎? – Chernobyl 2014-09-29 15:42:53

+0

@Olumide你確定你的樣式表加載正確嗎? – 2014-09-29 16:11:04

+0

@ N1ghtLight我確定樣式表加載正確。實際上,我打開樣式表文件並將其內容寫入'QApplication :: setStyleSheet()' – Olumide 2014-09-29 16:12:52

回答

3

不,不可能按照你想要的方式覆蓋QSS屬性,相信我,你不想。這不是您撥打setStyleSheet重要的順序。首先重要的是層次結構。呼叫順序僅對位於同一級別上的小部件起作用。

原因是小部件的內部樣式規則定義了重寫父類的樣式,因此應用程序樣式在您的情況下。這是一個尊重的層次結構。你可以看一下這個通過以下方式:

假設你有以下子層次結構QWidget

QWidget 
    |__QPushButton 
    | 
    |__QFrame 
    | | 
    | |_QListView 
    | 
    |__QProgressBar 

比方說,你想要的background-color定製層次結構中的所有部件。如果對QApplication::setStyleSheet()的調用會覆蓋子級的樣式表屬性,那麼您將無法爲子級設置自定義樣式。這就是爲什麼子部件的QSS屬性會覆蓋父部件的QSS屬性。

看看它像通常的方式來看待小部件。在QWidget的頂部顯示QPushButtonQFrame顯示在QWidget之上。 QListView也顯示在QWidget之上。樣式以相同的方式應用。

我推薦的做法是隻有一個外部的QSS文件,您可以在其中定義所需的一切。

編輯: 作爲N1ghtLight指出QSS蜜餞類的繼承層次結構,所以如果你設置一個屬性一類的所有派生類將繼承財產。例如,如果您有以下樣式:

QAbstractButton { 
    background-color: red; 
} 

QPushButton { 
    color: blue; 
} 

所有QPushButtons將背景色redQAbstractButton文本顏色blue作爲QPushButton繼承background-color屬性值是其祖先而QAbstractButton S的不QPushButton s會有背景色red,但文字顏色將保持不變。

上面的例子使用了一個類型選擇器。您可以使用不同的選擇器類型將樣式應用於特定的對象。您可以看到不同的選擇器類型here

+2

如果您願意,擴展您的答案,並解釋樣式表是如何爲基類定義樣式的可能性,例如QAbstractButton,並且這些樣式在繼承層次中繼承:) – 2014-09-29 18:29:05