2016-11-08 10 views
3

私は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です。申し訳ありませんが何かがひどく間違っている場合。ありがとう。

答えて

1

これは問題、画像のサイズを変更する

resizedImage = srcImage.scaled(self.width(), self.height(), 
            qc.Qt.KeepAspectRatio, 
            qc.Qt.SmoothTransformation) 

必要がありませんでした。これによりピクセル化されます! フルサイズの画像を提供すると問題が解決しました。

関連する問題