dev/qt/ DrawingObjects1
Here we draw spinning squares:
#!/usr/bin/env python3
import random
from PySide6.QtWidgets import (
QWidget,
QMainWindow,
QApplication,
)
from PySide6.QtCore import (
QPoint,
QRect,
Qt,
QDir,
Slot,
QTimer,
QStandardPaths,
)
from PySide6.QtGui import (
QMouseEvent,
QPaintEvent,
QPen,
QBrush,
QPainter,
QPainterPath,
QColor,
QPixmap,
)
import sys
from math import sin
import time
class Spinner:
def __init__(self,x,y,r,t0,fill=Qt.white,stroke=Qt.black,pw=1):
self.x = x
self.y = y
self.r = r
self.t0 = t0
self.fill = fill
self.stroke = stroke
self.pw = pw
def paint(self,painter):
t = time.time()
theta = 360*t/self.t0
painter.save()
painter.setBrush(self.fill)
pen = QPen(self.stroke)
pen.setCosmetic(True)
pen.setWidth(self.pw)
painter.setPen(pen)
painter.translate(self.x,self.y)
painter.rotate(theta)
painter.scale(self.r,self.r)
path = QPainterPath()
path.moveTo(-1,-1)
path.lineTo(1,-1)
path.lineTo(1,1)
path.lineTo(-1,1)
path.closeSubpath()
painter.drawPath(path)
painter.restore()
class MyWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.w, self.h = 680, 480
self.setFixedSize(self.w,self.h)
self.painter = QPainter()
self.pen = QPen()
self.penColor = QColor(0,255,0)
self.brushColor = QColor(255,0,0)
self.brush = QBrush()
self.pen.setCapStyle(Qt.RoundCap)
self.pen.setJoinStyle(Qt.RoundJoin)
self.pen.setWidth(2)
self.brush.setColor(self.brushColor)
self.pen.setColor(self.penColor)
self.pen.setCosmetic(True)
self.spinners = [
Spinner(200,200,100,1,Qt.cyan,Qt.green,8),
Spinner(200,300,80,2,Qt.yellow,QColor(45,78,145)),
Spinner(200,100,70,3) ,
Spinner(400,240,50,4) ,
Spinner(300,120,30,5)
]
#jda
self.setMouseTracking(True)
fps = 30
timer = QTimer(self)
timer.timeout.connect(self.update)
timer.setInterval(1000 // fps)
timer.start()
def paintEvent(self, event: QPaintEvent):
"""Override method from QWidget
Paint the Pixmap into the widget
"""
with QPainter(self) as painter:
painter.setBrush(self.brush)
painter.setPen(self.pen)
for spinner in self.spinners:
spinner.paint(painter)
def mouseMoveEvent(self, event: QMouseEvent):
"""
Override from QWidget
Called when user moves and clicks on the mouse
The widget only receives the events when the mouse
button is down unless mouseTracking == True.
"""
QWidget.mouseMoveEvent(self, event)
def mousePressEvent(self, event: QMouseEvent):
self.update()
def drawRandomRect(self,painter):
x0 = random.randrange(0,self.w-100)
x1 = random.randrange(x0+10,self.w)
y0 = random.randrange(0,self.h-100)
y1 = random.randrange(y0+10,self.h)
pw = random.randrange(1,20)
r,g,b,a = [random.randrange(0,256) for i in range(4)]
self.penColor = QColor(r,g,b)
r,g,b,a = [random.randrange(0,256) for i in range(4)]
self.brushColor = QColor(r,g,b,a)
self.pen.setWidth(pw)
self.brush.setColor(self.brushColor)
self.pen.setColor(self.penColor)
#self.painter.begin(target)
painter.setRenderHints(QPainter.Antialiasing, True)
painter.fillRect(QRect(QPoint(x0,y0),QPoint(x1,y1)),self.brushColor)
#self.painter.end()
#self.update()
def mouseReleaseEvent(self, event: QMouseEvent):
"""Override method from QWidget"""
QWidget.mouseReleaseEvent(self, event)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.widget = MyWidget()
self.setCentralWidget(self.widget)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())