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())