【问题标题】:How to put a shadow to a Frameless window in Qt如何在 Qt 中为无框窗口添加阴影
【发布时间】:2012-09-03 02:07:45
【问题描述】:

我正在尝试创建一个下面有阴影的无框窗口。当我们创建一个带有 Qt::FramelessWindowHint 标志的无边框窗口时,它不包含阴影。 但是我们可以通过创建一个 QGraphicsDropShadowEffect 对象,然后通过 setGraphicsEffect 函数将其传递给小部件来轻松地为子小部件设置阴影。但这似乎不适用于 QMainWindow。请帮我在 Qt 中为无框窗口添加阴影...

【问题讨论】:

    标签: qt window shadow borderless


    【解决方案1】:

    你可以使用这个简单的技巧来做到这一点:


    将“QWidget”(比如小部件)添加到 MainWindow 并将 MainWindow 上的所有内容移动到小部件。然后这样做:

    setAttribute(Qt::WA_TranslucentBackground); //enable MainWindow to be transparent
    
    QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
    effect->setBlurRadius(5);
    ui->widget->setGraphicsEffect(effect);
    

    这似乎对我有用。见:

    【讨论】:

    • 你是如何创建这些图形的?
    • 快一年了,具体记不太清了。也许我为此使用了 PicPick (picpick.org/en)——截取屏幕截图并进行了一些编辑。这是一个很好的方便的工具,用于截取屏幕截图和执行简单的图像处理。 :)
    • 我刚刚尝试用 PySide 实现它。看起来很整洁但是有一些大问题: 第一:阴影不是 ClickTrough!如果单击阴影,您仍在单击窗口:( 第二:阴影是窗口的一部分。最大化它会留下阴影间隙(如果真的最大化,您可能会抓住它并停用阴影边框)如果您水平最大化或者垂直只有这有点奇怪......该死。必须有一种方法告诉Windows使用系统阴影......虽然EA Origin游戏工具似乎正在使用这种方法^。我只是想要一个更大的阴影;]
    • 感谢这次黑客攻击,但我在这个场景中使用透明的东西时遇到了问题:bugreports.qt.io/browse/QTBUG-63199,有什么想法吗?谢谢。
    • 嗨@BillHoo 我会调查这个,但如果你能与我分享你的代码(或重现此问题的简单虚拟代码)会更容易。您可以将其粘贴到此处 (codeshare.io/5eMzD4) 或任何其他您想要的方式。
    【解决方案2】:

    我完全按照 zeFree 给出的说明(使用 Qt/C++)并且我的影子确实是点击通过(使用 Elementary OS Freya - 我不知道它和 Ubuntu、OX 之间是否存在不同的行为或 Windows)...我无法想象为什么你的不是。

    唯一的不同是我把父窗口边距和模糊半径都调大了,并且去掉了阴影偏移。

    这是我的sn-p:

    void addDialogShadow(QWidget *target) {
        target->window()->setAttribute(Qt::WA_TranslucentBackground);
        target->window()->layout()->setMargin(50);
        QGraphicsDropShadowEffect* ef = new QGraphicsDropShadowEffect;
        ef->setBlurRadius(50);
        ef->setOffset(0);
        target->setGraphicsEffect(ef);
    }
    

    编辑: 不,我的窗口没有点击(我想我写的时候睡着了)。事实上,即使我的 QDialog 实例中的 Qt::WA_TransparentForMouseEvent 属性也不起作用。在网上搜集信息,我发现做这项工作比我想象的要困难得多。

    【讨论】:

      【解决方案3】:

      一个不太好的解决方案是使用QtCore.Qt.ToolTip 窗口标志而不是FramelessWindowHint

      【讨论】:

      • 编辑:原因是半透明属性。
      • 它与 Qt::Popup “工作”,但一旦失去焦点,窗口就会隐藏。
      猜你喜欢
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多