En este capítulo del tutorial de Python 3 más PyQt5 veremos un ejemplo sencillo de trabajar con gráficos, concretamente, intentaremos crear un programa que de un modo simple emule la herramienta de dibujo de un programa como puede ser Paint de Windows. Este programa nos permitirá dibujar, borrar y limpiar el dibujo realizado. Para ello nos basaremos principalmente en las clases QGraphicsView (Plano de dibujo) y QGraphicsScene (Escenas o capas).
Referencia a la clase QGraphicsView: http://pyqt.sourceforge.net/Docs/PyQt4/qgraphicsview.html
Referencia a la clase QGraphicsScene: http://pyqt.sourceforge.net/Docs/PyQt4/qgraphicsscene.html
graficos.pyw
import sys from PyQt5.QtWidgets import QApplication, QDialog, QGraphicsView, QGraphicsScene, QGridLayout, QPushButton from PyQt5.QtCore import QPointF, QRectF, Qt from PyQt5.QtGui import QPen, QBrush from PyQt5 import uic class Paint(QGraphicsView): def __init__(self): QGraphicsView.__init__(self) self.setSceneRect(QRectF(self.viewport().rect())) self.scene = QGraphicsScene() self.isPaint = False self.isDelete = False self.isClear = False def tools(self, e): if self.isPaint == True: pen = QPen(Qt.black) brush = QBrush(Qt.SolidPattern) self.scene.addItem(self.scene.addEllipse(e.x(), e.y(), 3, 3, pen, brush)) self.setScene(self.scene) if self.isDelete == True: items = self.items(e.x(), e.y()) for item in items: self.scene.removeItem(item) def mousePressEvent(self, event): e = QPointF(self.mapToScene(event.pos())) self.tools(e) def mouseMoveEvent(self, event): e = QPointF(self.mapToScene(event.pos())) self.tools(e) class Dialogo(QDialog): def __init__(self): QDialog.__init__(self) self.resize(500, 500) self.layout = QGridLayout() self.setLayout(self.layout) self.paint = Paint() self.btn_paint = QPushButton("Dibujar") self.btn_delete = QPushButton("Borrar") self.btn_clear = QPushButton("Clear") self.layout.addWidget(self.btn_paint) self.layout.addWidget(self.btn_delete) self.layout.addWidget(self.btn_clear) self.layout.addWidget(self.paint) self.btnDefault = "background-color: grey; border: 0; padding: 10px" self.btnActive = "background-color: orange; border: 0; padding: 10px" self.btn_paint.setStyleSheet(self.btnDefault) self.btn_delete.setStyleSheet(self.btnDefault) self.btn_clear.setStyleSheet(self.btnDefault) self.btn_paint.clicked.connect(self.isPaint) self.btn_delete.clicked.connect(self.isDelete) self.btn_clear.clicked.connect(self.isClear) def resizeEvent(self, event): self.paint.setSceneRect(QRectF(self.paint.viewport().rect())) def isPaint(self): if self.paint.isPaint == False: self.paint.isPaint = True self.btn_paint.setStyleSheet(self.btnActive) else: self.paint.isPaint = False self.btn_paint.setStyleSheet(self.btnDefault) self.paint.isDelete = False self.paint.isClear = False self.btn_delete.setStyleSheet(self.btnDefault) self.btn_clear.setStyleSheet(self.btnDefault) def isDelete(self): if self.paint.isDelete == False: self.paint.isDelete = True self.btn_delete.setStyleSheet(self.btnActive) else: self.paint.isDelete = False self.btn_delete.setStyleSheet(self.btnDefault) self.paint.isPaint = False self.paint.isClear = False self.btn_paint.setStyleSheet(self.btnDefault) self.btn_clear.setStyleSheet(self.btnDefault) def isClear(self): if self.paint.isClear == False: self.paint.isClear = True self.btn_clear.setStyleSheet(self.btnActive) else: self.paint.isClear = False self.btn_clear.setStyleSheet(self.btnDefault) self.paint.isPaint = False self.paint.isDelete = False self.btn_paint.setStyleSheet(self.btnDefault) self.btn_delete.setStyleSheet(self.btnDefault) self.paint.scene.clear() app = QApplication(sys.argv) dialogo = Dialogo() dialogo.show() app.exec_()
No hay comentarios:
Publicar un comentario