Как создать полную прозрачность в QTextEdit - PullRequest
1 голос
/ 04 августа 2011

Я много дней пытался найти способ создания прозрачного Qtextedit с непрозрачным текстом.Поскольку термин «прозрачность» часто неоднозначен, я определяю «прозрачность» Qtextedit как возможность видеть текст в Qtextedit, наложенный на все, что находится непосредственно за главным окном (например, фон рабочего стола, проигрыватель Windows Media и т. Д.) Если возможноЯ хотел бы иметь возможность устанавливать прозрачность на разных уровнях и кросс-совместимостью, но это не обязательно.

Я начинающий, так как я использую pyqt4 в течение 3 недель и python 3.x в течение нескольких месяцев, и это весь опыт программирования, который я получил за время своего существования.Я пытался расшифровать документацию Pyqt по этому вопросу, но она написана таким образом, что, кажется, предполагается, что кто-то был программистом GUI в течение десятилетий, не говоря уже о знании C ++.Кроме того, когда этот вопрос задают в Интернете, он, кажется, никогда не решается так: а) хорошо документировано или б) обобщается

Это очень удивительно, потому что кажется, что базовая операция, которую люди хотели бы выполнитьdo

Это решение работает, но, по-видимому, не является полезным для чего-либо, кроме отображения прозрачных изображений.Я также не очень хорошо понимаю все это, так как простое изменение базового класса с QWidget на QMainWindow приводит к сбою всего этого

http://www.loopbacking.info/blog/2008/07/11/transparent-windows-howto/

Следующая ссылка описывает общие способы, которыми людиПредлагаю решить проблемы, подобные этим, их подводные камни и почему они не работают, но, к сожалению, они используют версию Qt на C ++, а также немного продвинулись в моих навыках на данный момент.

http://www.qtcentre.org/threads/18072-How-to-set-Qt-window-transparent

Моя система - Windows 7 Ultimate 32-битная на широте dell d830 с Quadro NVS 140, версия драйвера которой актуальна на этот пост (Версия 275.33) Моя версия Pyqt4.8 (PyQt-Py3.2-x86-gpl-4.8.5-1.exe 32-битный установщик Windows) Я также использую 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_())

1 Ответ

1 голос
/ 04 августа 2011

Чтобы сделать главное окно прозрачным, вы должны установить атрибут Qt.WA_TranslucentBackground (используя setAttribute(Qt.WA_TranslucentBackground)). В 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_()
...