PyQt透明背景图像部分黑色

时间:2016-06-21 09:49:39

标签: python qt 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 个答案:

答案 0 :(得分: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()