我已经尝试了很多天来找出一种方法来创建一个透明的Qtextedit与不透明的文本。因为术语"透明度"通常是模棱两可的,我定义Qtextedit"透明度"是能够看到Qtextedit中的文本覆盖在任何直接在主窗口后面(如桌面背景,windows媒体播放器等),如果可能的话,我希望能够设置透明度在不同的水平和跨系统兼容,但这不是必需的。
我是一个极端的初学者,因为我只使用pyqt4 3周和python 3。这是我一生中获得的所有编程经验。关于这个问题,我一直在试图破译Pyqt文档,但是它是以一种似乎假设一个人已经是几十年的gui程序员的方式编写的,更不用说具有c++知识了。此外,当这个问题在网上被问到时,它似乎从来没有以以下两种方式得到解决:a)记录良好或b)可概括
这是非常令人惊讶的,因为它似乎是人们想要做的基本操作
这个解决方案工作,但似乎没有直接用于显示透明图像的任何东西。我也不是很理解它,因为简单地将基类从QWidget更改为QMainWindow会使整个事情失败
http://www.loopbacking.info/blog/2008/07/11/transparent-windows-howto/下面的链接体现了人们建议解决类似问题的常见方法,它们的陷阱以及为什么它们不起作用,但不幸的是它们使用的是c++版本的Qt,并且在这一点上对我的技能来说也有点高级。
http://www.qtcentre.org/threads/18072-How-to-set-Qt-window-transparent我的系统是windows 7 ultimate 32位在戴尔纬度d830上与Quadro NVS 140的驱动程序版本是当前的这篇文章(Verde 275.33)我的Pyqt版本是4.8 (Pyqt - py3.2 -x86-gpl-4.8.5-1.exe windows 32位安装程序)我也使用Python 3.2.1(开源版本)
下面是我的代码的一个基本例子,相关的(和失败的)行被注释掉了:
当我尝试注释掉代码的颜色时,我通常只看到黑色。此外,当我调整我的窗口的大小黑暗会随机改变强度和主窗口的显示似乎被破坏,当最大化。
我将非常感谢任何帮助在这个问题上!import sys
import PyQt4
from PyQt4 import QtGui, QtCore
class Transparent(QtGui.QMainWindow):
def __init__(self,parent = None):
QtGui.QMainWindow.__init__(self,parent)
self.initialize()
def initialize(self):
#self.colorset(self,'Window',200,255,100,20)
#self.colorset(self,'Base',200,255,100,20)
#self.setBackgroundRole(QtGui.QPalette.Base)
#self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
#self.setAutoFillBackground(True)
#self.mask()
self.setWindowTitle("Chernobyl-like Failure")
self.answerlabel = QtGui.QLabel('Text Response Display')
self.answerlabel.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Raised)
self.answerlabel.setMinimumHeight(25)
self.questionlabel = QtGui.QLabel("Question:")
self.questionlabel.setFrameStyle(QtGui.QFrame.Panel | QtGui.QFrame.Raised)
self.questionbox = QtGui.QLineEdit()
self.questionbox.setMinimumWidth(500)
self.askbutton = QtGui.QPushButton("Ask it!")
self.historybox = QtGui.QTextEdit('Question & Answer history will be displayed here')
self.historybox.setReadOnly(True)
#self.colorset(self.historybox,'Base',200,255,100,127)
self.grid = QtGui.QGridLayout()
widgetlist = [['answerlabel',0,0,1,3],['questionlabel',1,0,1,1],
['questionbox',1,1,1,1],['askbutton',1,2,1,1],['historybox',2,0,1,3]]
for widget in widgetlist:
self.grid.addWidget(eval("self.{0}".format(widget[0])),*widget[1:])
self.centralwidget = QtGui.QFrame()
self.centralwidget.setFrameStyle(QtGui.QFrame.Box|QtGui.QFrame.Raised)
self.centralwidget.setLineWidth(5)
self.centralwidget.setLayout(self.grid)
#self.colorset(self.centralwidget,'Base',200,255,100,127)
self.setCentralWidget(self.centralwidget)
def colorset(self,widget,part,h,s,l,a):
pal = widget.palette()
color = QtGui.QColor()
color.setHsl(h,s,l,a)
pal.setColor(eval('QtGui.QPalette.{0}'.format(part)),color)
widget.setPalette(pal)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main_window = Transparent()
main_window.show()
sys.exit(app.exec_())
要使你的主窗口透明,你必须设置Qt.WA_TranslucentBackground属性(使用setAttribute(Qt.WA_TranslucentBackground)
)。在Windows下,您还必须在主窗口上设置qt . frameesswindowint属性。然而,根据文档,"用户不能通过窗口系统移动或调整无边界窗口的大小。"如果你想要那个功能,你必须手动实现它。下面是c++中的一个线程示例。
一旦你有了一个透明的主窗口,你可以通过设置背景颜色为RGBA值来控制它和任何子部件的不透明度。这是一个愚蠢的例子,
from PyQt4 import QtGui, QtCore
import sys
class Main(QtGui.QMainWindow):
def __init__(self, parent=None):
super(Main, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
frame = QtGui.QFrame(parent=self)
frame.setStyleSheet("QFrame {background: rgba(0,255,0,20%)}")
box=QtGui.QHBoxLayout()
edit = QtGui.QTextEdit()
edit.setStyleSheet("background: rgba(0,0,255,20%)")
box.addWidget(edit)
edit2=QtGui.QTextEdit()
edit2.setStyleSheet("background: rgb(255,0,0)")
box.addWidget(edit2)
frame.setLayout(box)
pushbutton = QtGui.QPushButton('Quit')
pushbutton.clicked.connect(self.close)
box.addWidget(pushbutton)
self.setCentralWidget(frame)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
main = Main()
main.show()
app.exec_()