PyQt5:如何将一个 QPixmap 放置在另一个 QPixmap 之上?

PyQt5: How to place a QPixmap on top of another QPixmap?

我想将一个QPixmap 放在另一个QPixmap 上。两者大小相同,所以我只想做一个叠加层。叠加图像中间有一个透明的椭圆。我认为它们应该是 QPixmap 格式,但是我不知道如何将它们放在彼此之上并在调整 window 大小时保持它们在原位。这是我的代码,显示我的背景图像是如何放置的。我附上了一张图片来解释我想要什么。

import sys
from PyQt5 import QtGui ,QtWidgets, uic
from PyQt5.QtCore import Qt
class Ergolab(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(Ergolab, self).__init__(*args, **kwargs)

        # Load the UI Page
        self.ui = uic.loadUi("mainwindow.ui",self)

        self.pixmap1 = QtGui.QPixmap('C:/Users/Frede/Desktop/img1.jpg')
        self.shoflexLLabel.setPixmap(self.pixmap1.scaled(self.shoflexLLabel.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
        self.shoflexLLabel.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        self.shoflexLLabel.setMinimumSize(150, 150) 
        self.shoflexLLabel.resize(800, 600)

        self.pixmap2 = QtGui.QPixmap('C:/Users/Frede/Desktop/img2.jpg')
        self.shoflexRLabel.setPixmap(self.pixmap2.scaled(self.shoflexRLabel.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
        self.shoflexRLabel.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        self.shoflexRLabel.setMinimumSize(150, 150) 
        self.shoflexRLabel.resize(800, 600)

    def resizeEvent(self, event):
        scaledSize = self.shoflexLLabel.size()                       
        if not self.shoflexLLabel.pixmap() or scaledSize != self.shoflexLLabel.pixmap().size():
            self.updateLabel()    

    def updateLabel(self):
        self.shoflexLLabel.setPixmap(self.pixmap1.scaled(        
                self.shoflexLLabel.size(), Qt.KeepAspectRatio,
                Qt.SmoothTransformation))     
        self.shoflexRLabel.setPixmap(self.pixmap2.scaled(        
                self.shoflexRLabel.size(), Qt.KeepAspectRatio,
                Qt.SmoothTransformation))

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = Ergolab()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':         
    main()

这是我想要的结果:

您必须通过将圆设置为剪辑路径来使用 QPainter:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        label = QtWidgets.QLabel()
        self.setCentralWidget(label)

        base_pixmap = QtGui.QPixmap("background.png")

        overlay_pixmap = QtGui.QPixmap("overlay.png")

        radius = 300

        r = QtCore.QRectF()
        r.setSize(radius * QtCore.QSizeF(1, 1))
        r.moveCenter(base_pixmap.rect().center())
        path = QtGui.QPainterPath()
        path.addEllipse(r)
        painter = QtGui.QPainter(base_pixmap)
        painter.setRenderHints(
            QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform
        )
        painter.setClipPath(path, QtCore.Qt.IntersectClip)
        painter.drawPixmap(QtCore.QPoint(), overlay_pixmap)
        painter.end()

        label.setPixmap(base_pixmap)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())