2017-03-01 77 views
1

刪除QPalette根據Qt's QWidget documentation如何從一個QWidget

QWidget的傳播明確的調色板角色從父到子。如果您爲調色板上的特定角色分配畫筆或顏色並將該調色板分配給小部件,則該角色將傳播至所有小部件的子項,覆蓋該角色的任何系統默認值。

我有一個小部件層次:

QMainWindow 'window' 
    |_QGroupBox 'box' 
      |_QLabel 'label' 
      |_QLabel 'label2' 

所以,如果我是叫box->setPalette(somePalette)新的調色板用於繪製boxlabellabel2

現在我想撤消此,即我想用box,labellabel2來使用我的默認調色板,這很簡單,我打電話box->setPalette(window->palette())對不對?

的問題與此是box技術上仍具有自定義調色板集(它使你通過它的調色板的深層副本),如果我修改的window調色板不再通過box傳播到labellabel2

那麼,我該如何從box中實際刪除調色板,以便恢復調色板傳播?

回答

1

我如何實際從盒子中刪除調色板,以便調色板傳播恢復?

您可以使用QWidget::setAttribute明確設置或刪除Qt::WA_WindowPropagation標誌以確保調色板是否傳播(或不傳播)。根據我的經驗,有時需要以後調用QWidget::update()

更新:還有Qt::WA_SetPalette屬性用於啓用/禁用單個小部件調色板更新。在這個特定情況下,我們需要先將調色板傳播到嵌套的小部件,正如作者在評論中所建議的那樣。 box->setPalette(window->palette()); box->setAttribute(WA_SetPalette, false);

+0

該文檔說'使頂層窗口繼承其父級的字體和調色板。「盒子」不是頂級窗口... – Troyseph

+0

找到一個WA_SetPalette小部件屬性,試着嘗試該小部件有自己的調色板。) – Troyseph

+0

我可以確認'WA_SetPalette'必須設置爲false,但只有在設置調色板完全匹配父級的調色板後。 '箱 - >調用SetPalette(窗口 - >調色板()); box-> setAttribute(WA_SetPalette,false);'不需要更新'! – Troyseph