2014-09-30 380 views
1

我有一個帶有透明背景的QDockWidget,但我想在浮動時更改背景顏色或背景圖像。它看起來並不像qt樣式表有一個僞狀態來告訴你它們是否浮動,所以我想知道:這是可能做到的嗎?QDockWidget浮動時更改背景顏色

回答

3

找到了解決辦法。添加代碼以下連接:

connect(knobDock, &QDockWidget::topLevelChanged, [&] (bool isFloating) 
    { 
     if (isFloating) 
     { 
      setAttribute(Qt::WA_TranslucentBackground, false); 
      setAttribute(Qt::WA_NoSystemBackground, false); 
     } 
    }); 

這將導致碼頭widgetto使用任何背景時船塢浮在樣式表中指定,但它會是透明的(即顯示主窗口背景),當它停靠。

0

您可以使用自定義屬性來執行此操作。

謝謝@phyatt鏈接到Dynamic Properties and Stylesheets

要在自定義類中聲明自定義屬性,你可以在寫的.cpp:

setProperty("customPropertyName", 1); 

或.H(不要忘記過定義和實現用的get/set訪問方法):

Q_PROPERTY(int customPropertyName, READ getCustomPropertyName, WRITE setCustomPropertyName); 

而且在全局樣式表文件,您可以使用自定義屬性的狀態如下:

.YourClass[customPropertyName="1"] { 
    background-color: transparent; 
} 

.YourClass[customPropertyName="2"] { 
    background-color: black; 
} 

此外它需要你的一套新的屬性值後重新加載對象實例的樣式,因爲樣式表不會自動重新計算:

object->style()->unpolish(tstFrame); 
object->style()->polish(tstFrame); 
object->update(); 

或:

object->setStyleSheet("/* */"); 
+1

我在其他地方的代碼中有自定義屬性,但存在一個嚴重的缺陷:屬性更改不會重新加載樣式表,您必須在每次屬性更改時重新加載並重新更新它,這將花費〜10秒,我用的紋理。你的例子實際上也稱這是一個壞方法。 – 2014-09-30 20:00:31

+0

@NicolasHolthaus,我在最後加了一個註釋,如果你使用全局樣式表,你可以只更新需要重新計算的對象的樣式表,希望這有助於 – 2014-09-30 20:15:06

+2

http://qt-project.org/維基/ DynamicPropertiesAndStylesheets – phyatt 2014-09-30 20:18:02