Python 具有透明背景的Qt小部件
(我正在使用PySide,但我认为对于任何语言绑定,答案都是相同/相似的) 我试着以形状时钟为例,定位,并使时钟(圆)的表面透明,这样我所看到的就是时钟指针和滴答声。就像这样,当示例运行时,它看起来像。我正在使用Windows7 到目前为止,我已经尝试了以下方法(在构造函数中):Python 具有透明背景的Qt小部件,python,qt,transparency,pyside,Python,Qt,Transparency,Pyside,(我正在使用PySide,但我认为对于任何语言绑定,答案都是相同/相似的) 我试着以形状时钟为例,定位,并使时钟(圆)的表面透明,这样我所看到的就是时钟指针和滴答声。就像这样,当示例运行时,它看起来像。我正在使用Windows7 到目前为止,我已经尝试了以下方法(在构造函数中): self.setAttribute(QtCore.Qt.WA_半透明背景) 时钟出现(任务栏中有显示),但我在任何地方都看不到它 self.setAttribute(QtCore.Qt.WA\u NoSystem
self.setAttribute(QtCore.Qt.WA_半透明背景)
- 时钟出现(任务栏中有显示),但我在任何地方都看不到它
self.setAttribute(QtCore.Qt.WA\u NoSystemBackground)
- 时钟出现,但有坚实的黑色背景
self.setWindowOpacity(0.5)
- 时钟出现,但整个时钟是透明的。我希望背景(面)是透明的,但我希望时钟指针是可见的
- 在时钟示例中,它们是:
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)
所以它也应该起作用吗?明白了
这来自原始示例代码(构造函数):
以下是修改后的版本(并根据我的问题进行操作):
删除
self.windowFlags()
是我丢失的部分。(我不太清楚为什么我需要删除它,或者为什么它一开始就在那里……还有很多东西需要学习)。如果我没记错的话,您也应该设置它的样式表:
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setStyleSheet("background:transparent;")
希望这能有所帮助。我认为这个小部件确实有一个透明的背景,但它显然是放在其他东西上,而不是。这是正确的说法吗?我稍微澄清了我的问题。你上面的代码确实使时钟表面之外的所有东西都是透明的,但我正试图使时钟表面本身透明(除了时钟指针和分钟刻度线之外的所有东西)。我以前没听说过WA_半透明背景。我试着将它添加到时钟样本中,并在KDE下运行,我得到的只是小部件的一个黑色背景。您在代码中还更改了哪些内容以及得到了什么结果?您是否注意到上面的
self.setWindowFlags
行中的更改?因此,您应该了解哪些标志是默认情况下由self.windowFlags()
设置的。这取决于具体情况。由于属性QtCore.Qt.WA_transparcentbackground
的缘故,小部件本身有一个透明的背景,并且不需要样式表本身,而是小部件中包含的具有autoFillBackground()的子部件==True
默认情况下应该将其取消设置,或者应该将其设置为QtCore.Qt.WA_transparcentbackground
,或者像您所说的那样,应该由样式表设置透明背景色,然后将其继承。
...
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
...
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setStyleSheet("background:transparent;")