2017-03-01 37 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