Qt QDockWidget浮动时更改背景色
我有一个透明背景的QDockWidget,但我想在它浮动时更改背景颜色或背景图像。qt样式表似乎没有一个伪状态来告诉您它们是否是浮动的,所以我想知道:这可能吗?您可以使用自定义属性来实现这一点 感谢链接到 要在自定义类中声明自定义属性,可以在.cpp中编写:Qt QDockWidget浮动时更改背景色,qt,qtstylesheets,qdockwidget,Qt,Qtstylesheets,Qdockwidget,我有一个透明背景的QDockWidget,但我想在它浮动时更改背景颜色或背景图像。qt样式表似乎没有一个伪状态来告诉您它们是否是浮动的,所以我想知道:这可能吗?您可以使用自定义属性来实现这一点 感谢链接到 要在自定义类中声明自定义属性,可以在.cpp中编写: setProperty("customPropertyName", 1); 或在.h中(不要忘记定义和实现使用的get/set访问方法): 在全局样式表文件中,您可以使用自定义属性的状态,如下所示: .YourClass[customPr
setProperty("customPropertyName", 1);
或在.h中(不要忘记定义和实现使用的get/set访问方法):
在全局样式表文件中,您可以使用自定义属性的状态,如下所示:
.YourClass[customPropertyName="1"] {
background-color: transparent;
}
.YourClass[customPropertyName="2"] {
background-color: black;
}
此外,还需要在设置新属性值后重新加载对象实例的样式表,因为样式表不会自动重新计算:
object->style()->unpolish(tstFrame);
object->style()->polish(tstFrame);
object->update();
或:
找到了解决办法。在代码中添加以下连接:
connect(knobDock, &QDockWidget::topLevelChanged, [&] (bool isFloating)
{
if (isFloating)
{
setAttribute(Qt::WA_TranslucentBackground, false);
setAttribute(Qt::WA_NoSystemBackground, false);
}
});
这将导致dock Widget在dock浮动时使用样式表中指定的任何背景,但在dock固定时它将是透明的(即显示主窗口背景)。我在其他位置的代码中有自定义属性,但存在一个严重缺陷:属性更改不会重新加载样式表,每次属性更改时,您都必须重新加载并重新抛光它,对于我使用的纹理,这需要约10秒。您的示例实际上也认为这是一种不好的方法。@NicolasHolthaus,我在结尾添加了一个注释,如果您使用全局样式表,您可以只在需要重新计算的对象上更新样式表,希望这有帮助
object->setStyleSheet("/* */");
connect(knobDock, &QDockWidget::topLevelChanged, [&] (bool isFloating)
{
if (isFloating)
{
setAttribute(Qt::WA_TranslucentBackground, false);
setAttribute(Qt::WA_NoSystemBackground, false);
}
});