根据Qt的QWidget文档
QWidget将显式调色板角色从父级传播到子级。如果将画笔或颜色分配给调色板上的特定角色,并将该调色板分配给小部件,则该角色将传播到小部件的所有子部件,覆盖该角色的任何系统默认值。
我有一个小部件层次结构:
QMainWindow 'window'
|_QGroupBox 'box'
|_QLabel 'label'
|_QLabel 'label2'因此,如果我要调用box->setPalette(somePalette),新的调色板将用于绘制box、label和label2
现在我想撤销这个问题,即我希望box、label和label2使用我的默认调色板,这很容易,我称之为box->setPalette(window->palette()),对吗?
这方面的问题是,box在技术上仍然有一个自定义的调色板集(它使您传递给它的调色板的副本很深),如果我修改window的调色板,它就不再通过box传播到label和label2。
那么,如何从box中实际删除调色板,从而恢复调色板的传播呢?
发布于 2017-03-01 15:40:48
如何将调色板从框中实际删除,以便恢复调色板的传播?
您可以使用QWidget::setAttribute显式设置或删除Qt::WA_WindowPropagation标志,以确保调色板被传播(或不传播)。根据我的经验,有时需要事后调用QWidget::update()。
UPDATE:还有Qt::WA_SetPalette属性,用于启用/禁用单个小部件调色板更新。对于这种特殊情况,我们需要首先将调色板传播到嵌套的小部件,正如作者在注释(如box->setPalette(window->palette()); box->setAttribute(WA_SetPalette, false); )中所建议的那样。
https://stackoverflow.com/questions/42535679
复制相似问题