【发布时间】:2014-11-25 13:03:14
【问题描述】:
我有一个具有透明背景的 QDockWidget,但我想在它浮动时更改背景颜色或背景图像。 qt 样式表似乎没有伪状态来告诉您它们是否浮动,所以我想知道:这可能吗?
【问题讨论】:
标签: qt qtstylesheets qdockwidget
我有一个具有透明背景的 QDockWidget,但我想在它浮动时更改背景颜色或背景图像。 qt 样式表似乎没有伪状态来告诉您它们是否浮动,所以我想知道:这可能吗?
【问题讨论】:
标签: qt qtstylesheets qdockwidget
找到了解决办法。在代码中添加如下连接:
connect(knobDock, &QDockWidget::topLevelChanged, [&] (bool isFloating)
{
if (isFloating)
{
setAttribute(Qt::WA_TranslucentBackground, false);
setAttribute(Qt::WA_NoSystemBackground, false);
}
});
这将导致停靠小部件在停靠时使用样式表中指定的任何背景,但停靠时它将是透明的(即显示主窗口背景)。
【讨论】:
您可以使用自定义属性来执行此操作。
感谢@phyatt 提供指向Dynamic Properties and Stylesheets 的链接。
要在自定义类中声明自定义属性,您可以在 .cpp 中编写:
setProperty("customPropertyName", 1);
或在 .h 中(不要忘记定义和实现使用的 get/set 访问方法):
Q_PROPERTY( int customPropertyName, READ getCustomPropertyName, WRITE setCustomPropertyName);
在您的全局样式表文件中,您可以使用以下自定义属性的状态:
.YourClass[customPropertyName="1"] {
background-color: transparent;
}
.YourClass[customPropertyName="2"] {
background-color: black;
}
还需要在设置新属性值后重新加载对象实例的样式表,因为样式表不会自动重新计算:
object->style()->unpolish(tstFrame);
object->style()->polish(tstFrame);
object->update();
或:
object->setStyleSheet("/* */");
【讨论】: