具有完全透明背景的 qt 小部件

Posted

技术标签:

【中文标题】具有完全透明背景的 qt 小部件【英文标题】:A qt widget with fully transparent background 【发布时间】:2010-11-25 15:43:31 【问题描述】:

我需要创建一个 qt 小部件,它将充当其他一些小部件的父级,并对它们进行排序。

现在的问题是如何让它的背景完全透明?

我想这样做:

struct Imp

  Imp( QWidget *parent ) : thisWidget( new QWidget( parent ) )
  
    thisWidget->setAttribute( Qt::WA_TranslucentBackground, true );
  

  QWidget *thisWidget;
;

你认为我需要设置属性,还是没有它会正常工作?

【问题讨论】:

你真的需要一个透明背景,还是有一个没有背景就足够了?这是一个真正的区别:在透明背景下,操作系统会告诉 underlying 窗口绘制像素。没有背景,操作系统只希望孩子们绘制整个窗口。 @MSalters 这个小部件被放置在一个窗口中,并且只有这个小部件的子小部件应该是可见的。应该看到这个小部件后面的任何东西(如果没有被子小部件覆盖)。 我不确定我是否理解这个问题...在 Qt4 中默认情况下,QWidget 不会为自己的背景绘制任何内容,只会绘制其子项。 @Caleb 是的,这似乎是正确的答案。你为什么以评论的形式回答? Make QWidget transparent的可能重复 【参考方案1】:

在 Qt4 中默认情况下,QWidget 不会为自己的背景绘制任何内容,只会绘制其子项。如果您想覆盖它,您必须特别告诉小部件通过其属性之一绘制其背景。请注意,从 QWidget 派生的一些小部件会自动绘制背景。

【讨论】:

如果我只想取消之前设置的背景(backgroundRole)。 @TomášZato:查询和记住以前的设置并使用它来恢复它的最简单方法。更难的方法之一是查询小部件的父级,获取父级的背景角色,并将其设置在小部件上。如果您需要将调色板的其余部分保持原样,所有这一切都很复杂。【参考方案2】:

您应该能够通过更改小部件的样式来完成您需要的所有绘图自定义

MyWidget background-color: none;

应该可以,样式表可以很容易地在设计器中测试

【讨论】:

如果你在 QLineEdit 上这样做,它会将背景从透明变为白色(我使用 PyQt),甚至不需要。有趣的效果。但我同意大多数时候使用 qss 很舒服。 background-color of "none" 对我不起作用,但 "transparent" 对我有用。【参考方案3】:

对我有用的解决方案(我正在为 QTextEditor 设置透明背景):

auto editorPalette = editorWidget->palette();
editorPalette.setColor(QPalette::Active, QPalette::Base, Qt::transparent);
editorPalette.setColor(QPalette::Inactive, QPalette::Base, Qt::transparent);
editorWidget->setPalette(editorPalette);

【讨论】:

【参考方案4】:

你可能想看看:

setAttribute( Qt::WA_NoSystemBackground, true );

setAttribute( Qt::WA_OpaquePaintEvent, false );

【讨论】:

【参考方案5】:

不知道它是否完全解决了你的问题,但它是discussed in this article

文档位于http://doc.qt.nokia.com/4.1/qwidget.html#transparency-and-double-buffering

解决方案适用于 Qt4.1,但应该是相关的。

【讨论】:

从第一个链接开始,他们谈到了使用 setBackgroundRole(QPalette::NoRole)。你认为它会起作用吗?

以上是关于具有完全透明背景的 qt 小部件的主要内容,如果未能解决你的问题,请参考以下文章

QWidget 背景透明

Qt半透明背景导致子小部件在父小部件中“印记”

如何让 qt 设计器自定义 QOpenGLWidget 小部件背景透明?

在透明的 qt 小部件上画一条线

使用透明背景、ttk 框架背景颜色配置 tkinter/ttk 小部件?

QT中的透明小部件