2016-06-21 105 views
0

奇妙なことに、私はPyQtアプリケーションで透明度を含む背景を正常に追加していますが、画像の多くは黒いままです。PyQt透明な背景画像部分的に黒色

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() 

実際の画像はthisのように見えながら、結果はthisあります。 (最初のリンクの白が正しく透明に機能していることに注意してください)

私はすべてを見て、これ以上頭を悩まし、十数個の解決策を試しました。誰でもこの現象が呼ばれていることを少なくとも説明することはできますか?

ありがとうございます!

答えて

1

私はついにこの問題を解決しました。答えは実際にはオーバーレイにあります。 QtGui.Qt.WA_TranslucentBackgroundをTrueに設定し、その中に含まれているウィジェットの背景を設定すると、メインウィンドウがデスクトップの背景を描画し、ウィジェット内の透過イメージが親ウィンドウから描画されます。画像を直接デスクトップの透明部分を継承し、背景を不透明に描画することは不可能です。部分的な不透明度を持つ画像の抽象化のレイヤーが必要なようです。

決勝コード:

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() 
関連する問題