Python 带边界半径的QMovie

Python 带边界半径的QMovie,python,pyqt,pyqt5,gif,qmovie,Python,Pyqt,Pyqt5,Gif,Qmovie,如何使用PyQt5中的QMovie应用边界半径,或以其他方式实现圆角效果?它似乎对QS没有反应。虽然我不认为这是相关的,但以下是我目前的代码,让我了解我的尝试: image = QLabel() image.setObjectName("rant-image") movie = QMovie("image_cache/" + img_name) image.setMovie(movie) movie.start() 使用QS: QLabel#rant-image{ border-rad

如何使用PyQt5中的QMovie应用边界半径,或以其他方式实现圆角效果?它似乎对QS没有反应。虽然我不认为这是相关的,但以下是我目前的代码,让我了解我的尝试:

image = QLabel()
image.setObjectName("rant-image")
movie = QMovie("image_cache/" + img_name)
image.setMovie(movie)
movie.start()
使用QS:

QLabel#rant-image{
    border-radius: 5px;
}
我还尝试通过子类化QWidget来绘制当前的pixmap-each-paintEvent,但没有显示任何内容,并且pixmap的维度为0:

invisible_pen = QPen()
invisible_pen.setWidth(0)
invisible_pen.setStyle(Qt.NoPen)


class RoundedMovie(QWidget):

    def __init__(self, movie, parent=None):
        QWidget.__init__(self, parent)
        self.movie = movie

    def setMovie(self, movie):
        self.movie = movie

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing, True)
        pixmap = self.movie.currentPixmap()
        brush = QBrush(pixmap)
        rect = QRect(0, 0, pixmap.width() - 10, pixmap.height() - 10)
        painter.setPen(invisible_pen)
        painter.setBrush(brush)
        painter.drawRoundedRect(rect, 5, 5)

我还知道上述实现无法正常工作,因为paintEvent的发生频率不足以按预期播放电影

一个可能的解决方案是实现
QProxyStyle

from PyQt5 import QtCore, QtGui, QtWidgets

class RoundPixmapStyle(QtWidgets.QProxyStyle):
    def __init__(self, radius=10, *args, **kwargs):
        super(RoundPixmapStyle, self).__init__(*args, **kwargs)
        self._radius = radius

    def drawItemPixmap(self, painter, rectangle, alignment, pixmap):
        painter.save()
        pix = QtGui.QPixmap(pixmap.size())
        pix.fill(QtCore.Qt.transparent)
        p = QtGui.QPainter(pix)
        p.setBrush(QtGui.QBrush(pixmap))
        p.setPen(QtCore.Qt.NoPen)
        p.drawRoundedRect(pixmap.rect(), self._radius, self._radius)
        p.end()
        super(RoundPixmapStyle, self).drawItemPixmap(painter, rectangle, alignment, pix)
        painter.restore()

if __name__ == '__main__':
    import sys 
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
    proxy_style = RoundPixmapStyle(radius=20, style=w.style())
    w.setStyle(proxy_style)
    movie = QtGui.QMovie("foo.gif")
    w.setMovie(movie)
    movie.start()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

如何实现最小宽度?@AlgoRythm最小宽度是什么意思?这些属性必须建立在qLabelif中,如果我设置一个大于GIF的固定大小,则GIF在中间左边绘制,在其周围有空白。@ AlgRyththm使用<代码> W= QtWIDGES.QLabor(对齐= QTCOR.Q.Access Calc,SaleDebug内容=TRUE)<代码> > AlgoRythm添加<代码> P.StReEndReNoTrt(QtGui.QPainter.Antialiasing)p=QtGui.QPainter(pix)之后