具有透明背景的 Qt 小部件

Posted

技术标签:

【中文标题】具有透明背景的 Qt 小部件【英文标题】:Qt Widget with Transparent Background 【发布时间】:2011-10-05 20:49:17 【问题描述】:

(我正在使用 PySide,但我认为任何语言绑定的答案都是相同/相似的)。

我试图以形状时钟为例,位于here,并让时钟(圆圈)的表面透明,这样我看到的只是时钟指针和分钟刻度。照原样,当示例运行时,它看起来像this。我使用的是 Windows 7。

到目前为止,我已经尝试了以下(在构造函数中):

self.setAttribute(QtCore.Qt.WA_TranslucentBackground) 时钟出现(在任务栏中出现),但我在任何地方都看不到它 self.setAttribute(QtCore.Qt.WA_NoSystemBackground) 时钟出现,但背景为纯黑色。 self.setWindowOpacity(0.5) 出现时钟,但整个时钟是透明的。我希望背景(脸)是透明的,但我希望时钟指针是可见的。

【问题讨论】:

为了记录,我认为小部件确实有透明背景,但它显然坐在其他没有的东西上。这是一个正确的说法吗? 【参考方案1】:

知道了!

这是来自原始示例代码(构造函数):

    ...
    self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)
    ...

这是修改后的(根据我的问题工作)版本:

    ...
    self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    ...

删除self.windowFlags() 是我缺少的部分。 (我不完全确定我为什么需要删除它,或者为什么它一开始就在那里......还有很多东西要学习)。

【讨论】:

嗯。我以前没有听说过 WA_TranslucentBackground。我尝试将它添加到时钟示例并在 KDE 下运行它,我得到的只是小部件的纯黑色背景。您还对代码进行了哪些更改,得到了什么结果? 您注意到上面self.setWindowFlags 行的变化了吗? 所以应该找出self.windowFlags()默认设置了哪些标志。【参考方案2】:

如果我没记错的话,你应该也设置了它的样式表:

self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setStyleSheet("background:transparent;")

希望对您有所帮助。

【讨论】:

视情况而定。由于属性QtCore.Qt.WA_TranslucentBackground,小部件本身具有透明背景,并且不需要样式表本身,但小部件中包含的子小部件但是默认情况下具有autoFillBackground()==True 的小部件应该取消设置或应该设置QtCore.Qt.WA_TranslucentBackground 或确实像你说的应该有一个由样式表设置的透明背景颜色,然后继承。 是的,就我而言,我也需要第三行来设置样式表。因为,我使用的是 kvantum,并且活动主题的样式似乎覆盖了任何非透明背景。但这又是我的假设。【参考方案3】:

在时钟示例中是:

void ShapedClock::resizeEvent(QResizeEvent * /* event */)
 
     int side = qMin(width(), height());
     QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side,
                          side, QRegion::Ellipse);
     setMask(maskedRegion);
 

“setMask”做圆形 但在 PySide 中也是如此:

def resizeEvent(self, event):
        side = min(self.width(), self.height())
        maskedRegion = QtGui.QRegion(self.width()/2 - side/2, self.height()/2 - side/2, side, side, QtGui.QRegion.Ellipse)
        self.setMask(maskedRegion)

所以它也应该工作?

【讨论】:

我稍微澄清了我的问题。您在上面的代码确实会导致钟面之外的所有内容都是透明的,但我正在尝试使钟面本身透明(除了时钟指针和分钟刻度线之外的所有内容)。

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

QWidget 背景透明

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

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

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

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

QT中的透明小部件