如何从QWidget

时间:2017-03-01 15:26:41

标签: qt qpalette

根据Qt's QWidget documentation

  

QWidget将显式调色板角色从父级传播到子级。如果将画笔或颜色分配给调色板上的特定角色并将该调色板指定给窗口小部件,则该角色将传播到窗口小部件的所有子窗口,从而覆盖该角色的任何系统默认值。

我有一个小部件层次结构:

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

因此,如果我打电话给box->setPalette(somePalette),新的调色板将用于绘制boxlabellabel2

现在我要撤消这一点,即我希望boxlabellabel2使用我的默认调色板,这很简单,我称之为box->setPalette(window->palette())吗? / p>

问题是box在技术上仍然有一个自定义调色板集(它会传递你传递它的调色板的深层副本),如果我修改window的调色板它不再传播通过boxlabellabel2

那么,我如何从box中删除调色板,以便恢复调色板传播?

1 个答案:

答案 0 :(得分:1)

  

如何从框中删除调色板以恢复调色板传播?

您可以使用QWidget::setAttribute显式设置或删除Qt::WA_WindowPropagation标记,以确保调色板的传播(或不传播)。根据我的经验,有时需要事后调用QWidget::update()

更新:还有Qt::WA_SetPalette属性用于启用/禁用单个窗口小部件选项板更新。在这种特定情况下,我们需要首先将调色板传播到嵌套小部件,正如作者在评论中建议的那样,例如: box->setPalette(window->palette()); box->setAttribute(WA_SetPalette, false);