一个完全透明背景的QT小部件

9

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

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

我想这样做:

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

  QWidget *thisWidget;
};

您认为我需要设置属性吗?还是不设置也可以正常工作?


你真的需要一个“透明”的背景,还是只需要没有背景就足够了?这是一个真正的区别:有了透明的背景,操作系统会告诉“底层”的窗口来绘制像素。没有背景,操作系统只期望子窗口来绘制整个窗口。 - MSalters
@MSalters 这个小部件被放置在一个窗口中,只有这个小部件的子部件应该是可见的。如果没有被子部件覆盖的话,应该能看到它后面的内容。 - BЈовић
我不确定我理解这个问题...在Qt4中,默认情况下,QWidget不会为自己的背景绘制任何内容,只有它的子元素才会被绘制。 - Caleb Huitt - cjhuitt
@Caleb 是的,那似乎是正确的答案。你为什么要以评论的形式回答呢? - BЈовић
我会给出一个答案,但我认为我可能错过了什么,因为默认行为非常容易观察。 - Caleb Huitt - cjhuitt
1
可能是 Make QWidget transparent 的重复问题。 - Violet Giraffe
5个回答

4

在Qt4中,默认情况下,QWidget不会绘制自己的背景,只有它的子级控件才会被绘制。如果你想要覆盖这个默认行为,你需要通过其中一个属性告诉控件绘制它的背景。注意,一些从QWidget派生的控件会自动绘制背景。


如果我只想取消之前设置的背景(backgroundRole),该怎么办? - Tomáš Zato
@TomášZato:查询和记住以前的设置,然后使用它来恢复是最简单的方法。其中一种更困难的方法是查询小部件的父级,获取父级的背景角色,并在小部件上设置该角色。如果您需要保留调色板的其余部分,则所有这些都会变得复杂。 - Caleb Huitt - cjhuitt

3
我认为您应该通过更改小部件的样式来进行所需的所有绘图自定义。
MyWidget {background-color: none;}

应该可以正常工作,样式表可以在设计师中进行非常容易的测试。

如果在QLineEdit上这样做,它会将背景从透明变为白色(我使用PyQt),甚至是不需要的。有趣的效果。但我同意大多数情况下使用qss非常舒适。 - Trilarion
2
“background-color” 的 “none” 对我不起作用,但是 “transparent” 可以。 - Richard Whitehead

0

您可能需要查看:

setAttribute( Qt::WA_NoSystemBackground, true );

setAttribute( Qt::WA_OpaquePaintEvent, false );

0
我遇到的解决方案(我正在为QTextEditor设置透明背景)是:
auto editorPalette = editorWidget->palette();
editorPalette.setColor(QPalette::Active, QPalette::Base, Qt::transparent);
editorPalette.setColor(QPalette::Inactive, QPalette::Base, Qt::transparent);
editorWidget->setPalette(editorPalette);

-1

从第一个链接中,他们谈论使用setBackgroundRole(QPalette :: NoRole)。你认为这会起作用吗? - BЈовић

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