Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使基于QWidget的窗口具有透明的背景?_Python_Qt_Pyqt_Transparent_Qwidget - Fatal编程技术网

Python 如何使基于QWidget的窗口具有透明的背景?

Python 如何使基于QWidget的窗口具有透明的背景?,python,qt,pyqt,transparent,qwidget,Python,Qt,Pyqt,Transparent,Qwidget,示例代码为,运行方式如下,图像如下所示: 主要策略是使用QBrush加载背景图像,该图像包含数字和其他内容,图片最初具有透明背景 但是如何使QWidget窗口具有透明背景一直困扰着我。如果您需要具有透明背景的窗口(基于QWidget),据我所知,只有在使窗口无框架的情况下才能实现这一点 下面的示例就是这样做的。重要的是设置窗口标志FramelessWindowHint和设置属性WA_transparcentbackground from PySide import QtCore, QtGui

示例代码为,运行方式如下,图像如下所示:

主要策略是使用
QBrush
加载背景图像,该图像包含数字和其他内容,图片最初具有透明背景


但是如何使
QWidget
窗口具有透明背景一直困扰着我。

如果您需要具有透明背景的窗口(基于QWidget),据我所知,只有在使窗口无框架的情况下才能实现这一点

下面的示例就是这样做的。重要的是设置窗口标志
FramelessWindowHint
和设置属性
WA_transparcentbackground

from PySide import QtCore, QtGui

app = QtGui.QApplication([])

window = QtGui.QWidget()
window.setWindowFlags(QtCore.Qt.FramelessWindowHint)
window.setAttribute(QtCore.Qt.WA_TranslucentBackground)
window.show()

layout = QtGui.QVBoxLayout(window)
button = QtGui.QPushButton('Exit')
button.clicked.connect(app.quit)
layout.addWidget(button)

app.exec_()

它只显示一个独立按钮。

在PyQt中,您需要使用按位或运算符|将该标志添加到所有现有窗口标志中,以使其工作:

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

然后呢
window.setAttribute(QtCore.Qt.WA_半透明背景)

请记住在设置标志后调用
show()
方法。此处引用文件:

注意:当更改窗口的标志时,此函数调用
setParent()
,导致小部件被隐藏。您必须调用
show()
使小部件再次可见

在按位运算符上:

希望这是有用的


编辑:由于@ekhumoro在下面的评论,删除了一些不正确的信息。

谢谢,我已经尝试过了,它有黑色背景。@wanze有趣。对我来说,这是完全透明的。PySide和PyQt应该在很大程度上兼容。我也在Windows7上使用Python3.4。我在Ubuntu系统中,可能是操作系统的问题?还是视频驱动程序的问题?我现在得放弃了。@wanze谢谢你的提示。今晚我将在Ubuntu下尝试。也许你只需要在那里设置一些额外的标志,也许gnome/kde不允许,我们会看到。
^
操作符使用错误:如果标志已经存在,它将删除标志。始终使用
|
确保设置标志。另外,
setAttribute
不会切换属性:您必须明确地将
False
作为第二个参数传递,才能删除属性(即
on
默认为
True
)。谢谢@ekhumaro。我编辑了我的答案以反映同样的情况。在过去,我错误地使用了按位异或。它起作用了,因为我从未使用相同的方法重新设置标志。是的,这是正确的选择。谢谢你抓住了这一点。文档有点误导性:如果是真的,它会显示on,否则它会清除它。他们的意思一定是假的。他们没有提到默认行为。谢谢你也指出了这一点。在另一个答案的示例中,使用PySide的行window.setWindowFlags(window.windowFlags()| QtCore.Qt.FramelessWindowHint)实际上会导致窗口完全消失,这很奇怪。你测试过这个吗?是的,我在回答中提到过。在此处引用文档:注意:当更改窗口的标志时,此函数调用setParent(),导致小部件被隐藏。必须调用show()使小部件再次可见。。如果这就是你的意思。