我如何在 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()
) 的完整矩形而不是中央小部件的完整矩形也呈现在菜单、工具栏等下,但我不建议您这样做,因为这可能会使这些元素难以看到,而且某些样式也可能在任何情况下都会绘制它们的背景。
有没有办法让我将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()
) 的完整矩形而不是中央小部件的完整矩形也呈现在菜单、工具栏等下,但我不建议您这样做,因为这可能会使这些元素难以看到,而且某些样式也可能在任何情况下都会绘制它们的背景。