2016-06-21 260 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()