我如何在 PyQt5 中将主要 Window 背景设置为 Base64 图像

How Could I Set The Main Window Background To A Base64 Image In PyQt5

有没有办法让我将base64代码设置为QMainWindow的背景。我不想保存这些图片,只是想将它们设置为背景。

这是我用来将 base64 代码转换为 QPixmap:

的代码
bkgnd = QtGui.QPixmap(QtGui.QImage.fromData(base64.b64decode('some base64 code')))

使用一些 base64 代码,它看起来像这样:

bkgnd = QtGui.QPixmap(QtGui.QImage.fromData(base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAeElEQVQ4T2NkoBAwUqifgboGzJy76AIjE3NCWmL0BWwumzV/qcH/f38XpCfHGcDkUVwAUsDw9+8GBmbmAHRDcMlheAGbQnwGYw0DZA1gp+JwFUgKZyDCDQGpwuIlrGGAHHAUGUCRFygKRIqjkeKERE6+oG5eIMcFAOqSchGwiKKAAAAAAElFTkSuQmCC')))

我搜索了如何将 QPixmap 设置为 window 背景,但我没有得到任何有用的东西。

没有直接的方法可以做到这一点,所以你需要实现主要的绘画事件window,并确保它的中心部件不绘制它的背景(通过在样式表或使用 autoFillBackground()).

以下将在中心呈现像素图:

class Win(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setCentralWidget(QtWidgets.QWidget())
        self.bkgnd = QtGui.QPixmap # base64 data ...

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        pmRect = self.bkgnd.rect()
        pmRect.moveCenter(self.centralWidget().geometry().center())
        qp.drawPixmap(pmRect, self.bkgnd)

您还可以获得平铺:

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.fillRect(self.centralWidget().geometry(), QtGui.QBrush(self.bkgnd))

拉伸图片内容:

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.drawPixmap(self.centralWidget().geometry(), self.bkgnd)

或保持纵横比缩放:

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        rect = self.centralWidget().geometry()
        scaled = self.bkgnd.scaled(rect.size(), QtCore.Qt.KeepAspectRatio)
        pmRect = scaled.rect()
        pmRect.moveCenter(rect.center())
        qp.drawPixmap(pmRect, scaled)

在上述所有情况下,如果要设置背景,您也可以尝试使用主要 window (self.rect()) 的完整矩形而不是中央小部件的完整矩形也呈现在菜单、工具栏等下,但我不建议您这样做,因为这可能会使这些元素难以看到,而且某些样式也可能在任何情况下都会绘制它们的背景。