如何从 QWidget 中删除 QPalette

Posted

技术标签:

【中文标题】如何从 QWidget 中删除 QPalette【英文标题】:How do you remove a QPalette from a QWidget 【发布时间】:2017-03-01 15:26:41 【问题描述】:

根据Qt's QWidget documentation:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

我如何真正从盒子中移除调色板,以便恢复调色板传播?

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

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

【讨论】:

文档说 Makes a toplevel window inherit font and palette from its parent. box 不是***窗口... 找到了一个WA_SetPalette 小部件属性,准备试试(Indicates that the widget has a palette of its own.) 我可以确认 WA_SetPalette 必须设置为 false,但前提是必须将调色板设置为与父调色板完全匹配。 box->setPalette(window->palette()); box->setAttribute(WA_SetPalette, false); 不需要update 见@Troyseph,所有并发症,例如样式表和重载的paintEvent 有时会出现问题,这就是update() 可能派上用场的原因。我想答案需要一些润色,并添加您的反馈。那我再等几个小时。

以上是关于如何从 QWidget 中删除 QPalette的主要内容,如果未能解决你的问题,请参考以下文章

从布局 QT 中删除 qwidget

无法从 QVBoxLayout 中删除自定义 QWidget

从 QLayout 中删除 QWidgets?

如何从 QStackedWidget 中删除所有小部件?

从布局中删除所有项目

Qt; QWidget 移除和删除。 setParent(NULL) 有必要吗?