Qt如何移除窗口边框?

3
有没有一种有效的方法可以在Qt中去掉框架并将背景色设置为透明?另外我想做的一件事是使窗口也能够“移动”,即每当我按住左键时,我可以将窗口移动到任何我喜欢的位置。
图形上表达我想要实现的结果。

enter image description here

enter image description here

----------

为使其“可移动”的解决方案:https://forum.qt.io/topic/34354/solved-frameless-window-dragging-issue/2

1个回答

1

首先你需要设置窗口标志(我在重载的QDialog::exec函数中进行此操作):

setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);

只需将Qt::FramelessWindowHint添加到您的窗口标志中即可。

然后您可以添加透明背景:

setAttribute(Qt::WA_TranslucentBackground);

确保autoFillBackground未设置(如果已经选中,请在设计器中取消选中)。

如果需要添加阴影,只需将DropShadowEffect添加到创建背景圆角矩形的小部件中即可:

auto dropShadow = new QGraphicsDropShadowEffect;
dropShadow->setOffset(0);
dropShadow->setBlurRadius(40);
dropShadow->setColor(QColor(0, 0, 0, 180));
ui.backgroundWidget->setGraphicsEffect(dropShadow);

小部件上的阴影是直接绘制上去的,因此您需要在背景小部件周围增加额外的空间。例如,如果您的BlurRadius设置为40,则应将边距设置为40像素:
layout()->setMargin(40);

哇,太棒了!你有什么想法如何使它能像我上面提到的那样“可移动”吗? - Joe Carr
我不知道是否有简单的方法使它“可移动”。我会重写mouseDownEvent、mouseUpEvent和mouseMoveEvent。使用mouseDownEvent存储鼠标位置相对于小部件和父小部件,在mouseMoveEvent中设置小部件位置,以便存储的小部件相对位置最终位于当前父小部件相对鼠标位置下面。 - Andreas H.
我认为这值得成为一个独立的问题。 - Joe Carr
1
我找到了如何使窗口可移动的方法,有兴趣的人可以在这里看一下: https://forum.qt.io/topic/34354/solved-frameless-window-dragging-issue/2 - Joe Carr

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