如何从 QWidget 中删除 QPalette

How do you remove a QPalette from a QWidget

根据Qt's QWidget documentation

QWidget propagates explicit palette roles from parent to child. If you assign a brush or color to a specific role on a palette and assign that palette to a widget, that role will propagate to all the widget's children, overriding any system defaults for that role.

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

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

所以如果我要调用 box->setPalette(somePalette) 新调色板用于绘制 boxlabellabel2

现在我想撤消这个,即我希望 boxlabellabel2 使用我的默认调色板,这很简单,我调用 box->setPalette(window->palette()) 对?

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

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

How do I actually remove the palette from box so that palette propagation is restored?

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

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