QLabel에 사용자 지정 Pixmap을 그려야합니다. 이미지를 원으로 표시해야하고 위젯에는 마우스를 가져 가면 애니메이션이 나타납니다 (예 : 윤곽선 강조 표시, 속성 애니메이션). 위젯의 paintEvent 내부에 전체 이미지를 그려 보았습니다. 그러나 성능 저하 비율은 상당히 용납 할 수 없습니다. 그래서 이미지 캐시를 만들고 페인트 이벤트 안에 픽스맵을 설정했지만 이미지가 픽셀 화됩니다. 내가 도대체 뭘 잘못하고있는 겁니까? paintEvent 내부의 동일한 함수는 고품질 이미지를 그립니다. 내가 픽스맵QPainter를 사용하여 효율적으로 이미지를 그리는 방법은 무엇입니까?
def fancyDraw(self, outlinePen):
hasValidImage = self._validateImage(self.image)
option = qg.QStyleOption()
option.initFrom(self)
x = option.rect.x()
y = option.rect.y()
width = option.rect.width() * self.radius
if not hasValidImage and self.shortName:
srcImage = qg.QPixmap(200, 200)
srcImage.fill(qc.Qt.transparent)
painter = qg.QPainter(srcImage)
# painter.begin()
painter.setRenderHint(qg.QPainter.Antialiasing)
painter.setBrush(self._brushText)
painter.setPen(self._penClear)
text_path = qg.QPainterPath()
text_width = self.font_metrics.width(self.shortName)
text_height = self.font().pointSize()
text_path.addText((200 - text_width)/2,
(200 - ((200 - text_height))/2) - 1,
self.font(), self.shortName)
painter.drawPath(text_path)
painter.end()
else:
srcImage = qg.QPixmap(qc.QString(self.image))
if srcImage.isNull():
logger.error("Failed to load image %s" % self.image)
resizedImage = srcImage.scaled(self.width(), self.height(),
qc.Qt.KeepAspectRatio,
qc.Qt.SmoothTransformation)
pixmap = qg.QPixmap(width, width)
pixmap.fill(qg.QColor("transparent"))
imgPainter = qg.QPainter(pixmap)
imgPainter.setRenderHint(qg.QPainter.Antialiasing)
clip = qg.QPainterPath()
clip.addEllipse(x + 1, y + 1, width - 2, width - 2)
imgPainter.setClipPath(clip)
imgPainter.drawPixmap(0, 0, width, width, resizedImage)
imgPainter.end()
painter = qg.QPainter(pixmap)
painter.setRenderHint(qg.QPainter.Antialiasing)
painter.setPen(outlinePen)
painter.drawEllipse(x + 1, y + 1, width - 2, width - 2)
painter.end()
return pixmap
에게 캐시 방법
이이 내가 전문 개발자, 가르쳐 단지 자기 아니에요 화가
self.normalPaint = self.fancyDraw(self._penBorder)
self.hoverPaint = self.fancyDraw(self._penBorder)
def paintEvent(self, event):
painter = qg.QPainter(self)
painter.drawPixmap(qc.QRect(self.x(), self.y(), self.width(), self.width()),
self.normalPaint)
안에 픽스맵을 설정하는 방법입니다. 그리고 이것은 stackoverflow 내 첫 질문입니다. 뭔가 끔찍한 일이 생겨서 죄송합니다. 감사.