Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 如何在QTextEdit中创建完全透明_Python_User Interface_Pyqt_Pyqt4 - Fatal编程技术网

Python 如何在QTextEdit中创建完全透明

Python 如何在QTextEdit中创建完全透明,python,user-interface,pyqt,pyqt4,Python,User Interface,Pyqt,Pyqt4,我已经尝试了很多天,想找出一种方法,用不透明的文本创建一个透明的Qtextedit。因为术语“透明性”常常模棱两可,我将Qtextedit“透明性”定义为能够看到Qtextedit中的文本覆盖在主窗口正后方的任何内容上(如桌面背景、windows media player等)如果可能的话,我希望能够设置不同级别的透明度和跨系统兼容,但这不是必需的 我是一个极端的初学者,因为我只使用了3周的pyqt4和几个月的Python3.x,这就是我在生活中获得的所有编程经验。我一直试图破解PYQT文档,但是

我已经尝试了很多天,想找出一种方法,用不透明的文本创建一个透明的Qtextedit。因为术语“透明性”常常模棱两可,我将Qtextedit“透明性”定义为能够看到Qtextedit中的文本覆盖在主窗口正后方的任何内容上(如桌面背景、windows media player等)如果可能的话,我希望能够设置不同级别的透明度和跨系统兼容,但这不是必需的

我是一个极端的初学者,因为我只使用了3周的pyqt4和几个月的Python3.x,这就是我在生活中获得的所有编程经验。我一直试图破解PYQT文档,但是这篇文章的编写方式似乎假定一个人已经是GUI程序设计器几十年了,更不用说C++的知识了。此外,当这个问题在网上被问到时,它似乎永远不会以这样的方式得到解决:a)有充分的记录或b)概括

这是非常令人惊讶的,因为这似乎是人们想要做的基本操作

此解决方案可以工作,但除了显示透明图像外,似乎对任何事情都没有直接的帮助。我也不是很了解它,因为简单地将基类从QWidget更改为QMainWindow会使整个过程失败

下面的链接体现了人们建议解决类似问题的常见方式,它们的缺陷以及它们为什么不工作,但不幸的是,它们使用QT版本的C++版本,并且在这一点上也有点先进。p>

我的系统是戴尔latitude d830上的windows 7 ultimate 32位,带有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_半透明背景属性(使用
setAttribute(Qt.WA_半透明背景)
)。在Windows下,还必须在主窗口上设置Qt.FramelessWindowHint属性。然而,根据“用户无法通过窗口系统移动或调整无边框窗口的大小。”因此,如果您需要该功能,则必须手动实现它。这里给出了一个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_()

要使主窗口透明,必须设置Qt.WA_半透明背景属性(使用
setAttribute(Qt.WA_半透明背景)
)。在Windows下,还必须在主窗口上设置Qt.FramelessWindowHint属性。然而,根据“用户无法通过窗口系统移动或调整无边框窗口的大小。”因此,如果您需要该功能,则必须手动实现它。这里给出了一个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_()

谢谢,这工作做得很好!如何删除文本编辑后面的QFrame和QWindow部分,以便QFrame和QWindow的颜色/不透明度不会影响文本编辑的背景?在您的示例中,我尝试将self.setMask(QtGui.QRegion(edit.rect())和self.setMask(QtGui.QRegion(self.edit.rect())放在一起,但它们都没有做什么。这是一个好问题。我不知道你是否可以只在文本编辑后改变窗口的透明度。谢谢你,这非常有效!如何删除文本编辑后面的QFrame和QWindow部分,以便QFrame和QWindow的颜色/不透明度不会影响文本编辑的背景?在您的示例中,我尝试将self.setMask(QtGui.QRegion(edit.rect())和self.setMask(QtGui.QRegion(self.edit.rect())放在一起,但它们都没有做什么。这是一个好问题。我不知道你是否只能在文本编辑后更改窗口透明度。