PyQt - 透明背景

发布于 2024-07-17 14:47:16 字数 310 浏览 5 评论 0原文

我尝试使窗口的背景透明。 但在其上的小部件下,我看到了桌面图像的一部分。 现在我在构造函数中有这个:

 self.setFocusPolicy(Qt.StrongFocus) 
      self.setAttribute(Qt.WA_QuitOnClose,True) 

      self.setBackgroundRole(QtGui.QPalette.Base) 
      self.setAttribute(Qt.WA_NoSystemBackground) 
  

I try to make the background of my window transparent. But under widgets which are on it i see parts of my desktop-image.
Now i have this in constructor:

    self.setFocusPolicy(Qt.StrongFocus)
    self.setAttribute(Qt.WA_QuitOnClose,True)

    self.setBackgroundRole(QtGui.QPalette.Base)
    self.setAttribute(Qt.WA_NoSystemBackground)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏天碎花小短裙 2024-07-24 14:47:16

我刚刚发现这个

创建半透明窗口

从 Qt 4.5 开始,就可以
创建半透明的窗口
支持的窗口系统上的区域
合成。

要在顶级中启用此功能
小部件,设置它的
Qt::WA_TranslucentBackground 属性
使用 setAttribute() 并确保
它的背景涂有
您所在区域的非不透明颜色
希望部分透明。

PyQt 仍然是 Qt 4.4,也许这就是问题所在。

I've just found this:

Creating Translucent Windows

Since Qt 4.5, it has been possible to
create windows with translucent
regions on window systems that support
compositing.

To enable this feature in a top-level
widget, set its
Qt::WA_TranslucentBackground attribute
with setAttribute() and ensure that
its background is painted with
non-opaque colors in the regions you
want to be partially transparent.

PyQt is still Qt 4.4, maybe that is the problem.

花桑 2024-07-24 14:47:16

除了gs的回答之外,此常见问题解答解释了为什么(在Qt 4.5之前)您无法实现此目的:

常见问题解答链接:

没有直接支持部分
透明度,窗口所在的位置
透明并且上面的小部件是
不在 Qt 中。

请记住,PyQt 的最新版本是针对 Qt 4.4 创建的,因此不支持您想要的半透明窗口。 如果您将主窗口的背景颜色设置为透明以外的任何颜色,则 gs 的另一个答案,关于 setAutoFillBackground(True) 将会起作用。

另外,请参阅 Qt.WA_NoSystemBackground 的文档,它说您不能依赖迄今为止的透明效果:

Qt::WA_NoSystemBackground

表示该小部件没有
背景,即当小部件
接收绘制事件,背景
不会自动重新绘制。 笔记:
与 WA_OpaquePaintEvent 不同,新
暴露的区域永远不会被填充
背景(例如,在显示
用户第一次可以打开窗口
看透它直到申请
处理绘制事件)。 这是
由小部件的作者设置/清除。

Further to gs's answer, this faq explains why (before Qt 4.5) you cannot achieve this:

FAQ Link:

There is no direct support for partial
transparency, where the window is
transparent and the widgets on it are
not in Qt.

Remember, PyQt's most recent version was created against Qt 4.4, and so does not support the semi-transparent window you desire. gs's other answer, about setAutoFillBackground(True) would work if you were setting the background colour of your main window to anything other than transparent.

Also, see the documentation for Qt.WA_NoSystemBackground, it says you can't depend on the transparent effect that you have so far had:

Qt::WA_NoSystemBackground

Indicates that the widget has no
background, i.e. when the widget
receives paint events, the background
is not automatically repainted. Note:
Unlike WA_OpaquePaintEvent, newly
exposed areas are never filled with
the background (e.g after showing a
window for the first time the user can
see "through" it until the application
processes the paint events). This is
set/cleared by the widget's author.

我不在是我 2024-07-24 14:47:16

为你的小部件尝试这个:

widget.setAutoFillBackground(True)

我想你也可以在 Qt Designer 中设置它。

Try this for your widgets:

widget.setAutoFillBackground(True)

I think you could also set it in the Qt Designer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文