2016-06-21 9 views
0

Seltsamerweise, während ich erfolgreich einen Hintergrund mit Transparenz in einer PyQt-Anwendung hinzugefügt habe, bleibt ein Großteil des Bildes schwarz.PyQt transparentes Hintergrundbild teilweise schwarz

from PyQt4.QtGui import * 
import sys 

class BackgroundIssue(QMainWindow): 
    def __init__(self): 
     super(BackgroundIssue, self).__init__() 

    def resizeEvent(self, event): 
     pixmap = QPixmap("res/background.png") 
     region = QRegion(pixmap.mask()) 
     self.setMask(pixmap.mask()) 


def main(): 
    app  = QApplication(sys.argv) 
    window = BackgroundIssue() 

    palette = QPalette() 
    palette.setBrush(QPalette.Background,QBrush(QPixmap("res/background.png"))) 

    window.setPalette(palette) 
    window.setWindowTitle("Partially Black Background Image") 
    window.show() 

    return app.exec_() 

if __name__ == '__main__': 
    main() 

Das Ergebnis ist this, während das aktuelle Bild wie this aussieht. (Beachten Sie, dass das Weiß in der ersten Verbindung korrekt funktioniert Transparenz.)

Ich habe alles geschaut und mir den Kopf darüber und versuchte ein Dutzend verschiedene Lösungen. Kann jemand wenigstens erklären, wie dieses Phänomen genannt wird?

Danke!

Antwort

1

Ich habe dieses Problem endlich gelöst: Die Antwort liegt tatsächlich in der Überlagerung. Wenn Sie QtGui.Qt.WA_TranslucentBackground auf True setzen und dann den Hintergrund in einem darin enthaltenen Widget festlegen, zeichnet das Hauptfenster den Hintergrund des Desktops und anschließend das transparente Bild im Widget vom übergeordneten Fenster. Es scheint, dass es unmöglich ist, dass ein Bild die Transparenz des Desktops direkt erbt und den Hintergrund in die Deckkraft zeichnet. Es scheint eine Notwendigkeit für eine Abstraktionsschicht für jedes Bild zu geben, das eine teilweise Opazität aufweist.

Schlusscode:

from PyQt4 import QtGui, QtCore 
import sys 

class BackgroundWidget(QtGui.QWidget): 
    def __init__(self): 
     super(BackgroundWidget, self).__init__() 

     palette = QtGui.QPalette() 
     palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(QtGui.QPixmap("res/img/background.png"))) 
     self.setAutoFillBackground(True) 
     self.setPalette(palette) 

     self.show() 

class BackgroundIssue(QtGui.QMainWindow): 
    def __init__(self): 
     super(BackgroundIssue, self).__init__() 

     self._widget = BackgroundWidget() 
     self.setCentralWidget(self._widget) 
     self.setWindowFlags(QtCore.Qt.FramelessWindowHint) 
     self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True) 
     self.resize(1002, 660) 
     self.setWindowTitle("Partially Black Background Image") 

     self.show() 

    def resizeEvent(self, event): 
     pixmap = QtGui.QPixmap("res/background.png") 
     region = QtGui.QRegion(pixmap.mask()) 
     self.setMask(pixmap.mask()) 


def main(): 
    app  = QtGui.QApplication(sys.argv) 
    window = BackgroundIssue() 

    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main()