#!/usr/bin/env python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2016/10/13 22:07:01 +0900> """ PySideでウインドウに描画。 マウスを動かしてお絵かきできる。 QGraphics* を使う。 ヲドリテヒヅル PyQtでイメージビューワ http://melpystudio.blog82.fc2.com/blog-entry-138.html """ import sys from PySide.QtCore import * from PySide.QtGui import * width = 640 height = 480 brushPath = 'ball.png' class ImageViewScene(QGraphicsScene): """ メインビューと関連付けられる Scene """ def __init__(self, *argv, **keywords): super(ImageViewScene, self).__init__(*argv, **keywords) self.buttonFlag = False self.pixmap = QPixmap(width, height) self.pixmap.fill() self.brushImage = QPixmap(brushPath) # Scene に Item を追加 self.imgItem = QGraphicsPixmapItem(self.pixmap) self.addItem(self.imgItem) def mouseDoubleClickEvent(self, event): pass def mousePressEvent(self, event): """ マウスボタンが押された際の処理 """ if event.button() == Qt.LeftButton: self.buttonFlag = True self.drawing(event) elif event.button() == Qt.RightButton: self.pixmap.fill() self.imgItem.setPixmap(self.pixmap) def mouseMoveEvent(self, event): """ マウスカーソル移動中の処理 """ if self.buttonFlag: self.drawing(event) def mouseReleaseEvent(self, event): """ マウスボタンが離されたときの処理 """ if event.button() == Qt.LeftButton: self.buttonFlag = False def drawing(self, event): """ ブラシで描画 """ x = event.scenePos().x() y = event.scenePos().y() x -= self.brushImage.width() / 2 y -= self.brushImage.height() / 2 qp = QPainter() qp.begin(self.pixmap) qp.drawPixmap(x, y, self.brushImage) qp.end() del qp # 描画更新する方法が分からない… # 仕方なく、pixmap を再設定してるけど…これでいいの? self.imgItem.setPixmap(self.pixmap) # self.imgItem.update() # self.update() class ImageViewer(QGraphicsView): """ メインとなるビュー """ def __init__(self): super(ImageViewer, self).__init__() self.setCacheMode(QGraphicsView.CacheBackground) self.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform | QPainter.TextAntialiasing ) scene = ImageViewScene(self) self.setScene(scene) scene.setSceneRect(QRectF(self.rect())) def resizeEvent(self, event): """ ビューをリサイズ時にシーンの矩形を更新 """ super(ImageViewer, self).resizeEvent(event) self.scene().setSceneRect(QRectF(self.rect())) if __name__ == '__main__': app = QApplication(sys.argv) viewer = ImageViewer() viewer.show() sys.exit(app.exec_())