如何在Qt中为无边框窗口添加阴影

13

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

3个回答

14

你可以使用这个简单的技巧来实现:


向MainWindow中添加一个"QWidget"(比如说widget),并将所有在MainWindow上的内容移动到widget中。然后执行以下操作:

setAttribute(Qt::WA_TranslucentBackground); //enable MainWindow to be transparent

QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
effect->setBlurRadius(5);
ui->widget->setGraphicsEffect(effect);

这对我来说似乎有效。请参见:

一个主窗口有阴影的视错觉


你是如何创建那些图形的? - ssc
2
我刚试着用 PySide 实现了这个功能。看起来很不错,但是还有一些大问题:第一:阴影不是透明的!如果你点击阴影,你仍然会点击到窗口 :( 第二:阴影是窗口的一部分。最大化它会留下一个阴影间隙(在真正最大化时,你可能能够捕捉到并停用阴影边框)。如果只是水平或垂直最大化,这就有点奇怪了...该死的。肯定有一种方法告诉Windows使用系统阴影...EA Origin游戏工具似乎正在使用这种方法^。我只想要一个更大的阴影;] - ewerybody
谢谢这个技巧,但是在这种情况下使用透明材质时我遇到了问题:https://bugreports.qt.io/browse/QTBUG-63199,有什么想法吗?谢谢。 - Bill Hoo
@zeFree 感谢您的回复,演示代码已经放在您提供的链接中。您可以尝试并查看启用 WA_TransluentBackground 功能后会发生什么。 - Bill Hoo
谢谢!我会研究一下并回复您!如果我解决了问题,我会在这里发布/更新答案。 - zeFree
显示剩余4条评论

2

我按照zeFree提供的指示(使用Qt / C ++)完全操作,我的阴影确实是可点击的(使用Elementary OS Freya - 我不知道它与Ubuntu,OX或Windows之间是否有不同的行为)...我无法想象为什么你的不是。

唯一的区别是我使父窗口边距和模糊半径都变大,并删除了阴影偏移。

这是我的片段:

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属性也无效。在网上搜集信息后,我发现要使其起作用比我想象的要困难得多。


0

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

at least a little shadow


编辑:原因是半透明属性。 - ManuelSchneid3r
它可以与Qt :: Popup一起“工作”,但是窗口一旦失去焦点就会隐藏。 - Adrian Maire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接