具有完全透明背景的 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 小部件的主要内容,如果未能解决你的问题,请参考以下文章
如何让 qt 设计器自定义 QOpenGLWidget 小部件背景透明?