【问题标题】:QDockWidget change background color when floatingQDockWidget 浮动时改变背景颜色
【发布时间】:2014-11-25 13:03:14
【问题描述】:

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

【问题讨论】:

    标签: qt qtstylesheets qdockwidget


    【解决方案1】:

    找到了解决办法。在代码中添加如下连接:

        connect(knobDock, &QDockWidget::topLevelChanged, [&] (bool isFloating)
        {
            if (isFloating)
            {
                setAttribute(Qt::WA_TranslucentBackground, false);
                setAttribute(Qt::WA_NoSystemBackground, false); 
            }
        });
    

    这将导致停靠小部件在停靠时使用样式表中指定的任何背景,但停靠时它将是透明的(即显示主窗口背景)。

    【讨论】:

      【解决方案2】:

      您可以使用自定义属性来执行此操作。

      感谢@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("/* */");
      

      【讨论】:

      • 我在其他地方的代码中有自定义属性,但是有一个严重的缺陷:属性更改不会重新加载样式表,每次属性都必须重新加载和重新抛光更改,这需要我使用的纹理大约 10 秒。您的示例实际上也称这是一种不好的方法。
      • @NicolasHolthaus,我在最后添加了一条注释,如果您使用全局样式表,您可以只在需要重新计算的对象上更新样式表,希望对您有所帮助
      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2021-12-11
      • 2013-07-20
      • 2015-05-23
      • 2018-03-08
      相关资源
      最近更新 更多