Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QDockWidget浮动时更改背景色_Qt_Qtstylesheets_Qdockwidget - Fatal编程技术网

Qt QDockWidget浮动时更改背景色

Qt QDockWidget浮动时更改背景色,qt,qtstylesheets,qdockwidget,Qt,Qtstylesheets,Qdockwidget,我有一个透明背景的QDockWidget,但我想在它浮动时更改背景颜色或背景图像。qt样式表似乎没有一个伪状态来告诉您它们是否是浮动的,所以我想知道:这可能吗?您可以使用自定义属性来实现这一点 感谢链接到 要在自定义类中声明自定义属性,可以在.cpp中编写: setProperty("customPropertyName", 1); 或在.h中(不要忘记定义和实现使用的get/set访问方法): 在全局样式表文件中,您可以使用自定义属性的状态,如下所示: .YourClass[customPr

我有一个透明背景的QDockWidget,但我想在它浮动时更改背景颜色或背景图像。qt样式表似乎没有一个伪状态来告诉您它们是否是浮动的,所以我想知道:这可能吗?

您可以使用自定义属性来实现这一点

感谢链接到

要在自定义类中声明自定义属性,可以在.cpp中编写:

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); 
        }
    });