Прежде всего, всегда приводите минимальный, воспроизводимый пример .
Затем, здесь есть некоторые заблуждения, которые требуют некоторых пояснений:
- вы можете 'обрезать' содержимое растрового изображения просто так, поскольку таблица стилей, заданная для QLabel, не заботится о его содержимом;
QPixmap.scaled()
возвращает " a копия растрового изображения, масштабированного до прямоугольника с заданной шириной и высотой"; поскольку вы не используете возвращаемое значение, ваш вызов совершенно бесполезен; - вызов
fill()
не требуется, если вы собираетесь загружать данные из существующего файла, до тех пор, пока эти данные успешно загружены;
Единственный способ "обрезать" изображение, как вы хотели бы сделать, это применить clipping (что более точно термин для этого вида обработки изображений).
Обратите внимание, что таблицы стилей, примененные к Qt, не могут быть доступны напрямую, поэтому у вас нет прямого способа узнать значение border-radius
.
source = QtGui.QPixmap()
# I really don't know what "pFile_picLink" is, but you really shouldn't use it
# like that; use python's "with open()" or QFile.readAll() instead.
source.loadFromData(pFile_picLink)
output = QtGui.QPixmap(source.width(), source.height())
output.fill(QtCore.Qt.transparent)
# create a new QPainter on the output pixmap
qp = QtGui.QPainter(output)
clipPath = QtGui.QPainterPath()
# the "40" value is taken from the border radius of the label stylesheet
clipPath.addRoundedRect(QtCore.QRectF(source.rect()), 40, 40)
# clip the contents to the rounded path we just created
qp.setClipPath(clipPath)
qp.drawPixmap(0, 0, source)
# ending the QPainter object is mandatory when dealing with painter
# objects created for images
qp.end()
self.pPic.setPixmap(output)
Наконец и совершенно не связаны, избегайте смешивания стилей импорта: в вашем коде есть Qt.transparent
и QtCore.Qt.AlignCenter
.
Используйте либо from PyQt5 import QtCore
вместе с QtCore.Qt.whatever
, либо from PyQt5.QtCore import Qt
с Qt.whatever
; смешивать их просто непонятно и абсолютно не нужно.