```python import sys from PySide6.QtCore import * from PySide6.QtGui import * from PySide6.QtWidgets import * from PySide6.QtNetwork import * app = QApplication(sys.argv) win = QMainWindow() win.setFixedSize(640,512) class Rect: def __init__(self,x,y,w,h,color): self.x = x self.y = y self.w = w self.h = h self.color = color self.sel = False def paint(self,painter,stroke=False): rect = QRect(self.x,self.y,self.w,self.h) painter.fillRect(rect,self.color) if stroke: painter.save() painter.pen().setWidth(2) painter.pen().setColor(QColor.fromRgb(0,0,0)) painter.setBrush(Qt.NoBrush) painter.drawRect(rect) painter.restore() def hit(self,x,y): if x < self.x: return False if y < self.y: return False if x > self.x + self.w: return False if y > self.y + self.h: return False return True class Rects(QWidget): def __init__(self,*xs,**kw): super().__init__(*xs,**kw) self.rects = [ Rect(10,10,100,200,QColor.fromRgb(255,0,0)), Rect(30,30,100,200,QColor.fromRgb(0,255,0)) ] self.selrect = None self.rx0 = 0 self.ry0 = 0 self.x0 = 0 self.y0 = 0 def paintEvent(self,event): with QPainter(self) as painter: for r in self.rects: r.paint(painter,r.sel) def mousePressEvent(self,event): pos = event.position().toPoint() x,y = pos.x(),pos.y() for r in reversed(self.rects): if r.hit(x,y): r.sel = True self.selrect = r self.rx0 = r.x self.ry0 = r.y self.x0 = x self.y0 = y self.update() break return super().mousePressEvent(event) def mouseReleaseEvent(self,event): if self.selrect: pos = event.position().toPoint() x,y = pos.x(),pos.y() dx,dy = x-self.x0,y-self.y0 self.selrect.x = self.rx0+dx self.selrect.y = self.ry0+dy self.selrect.sel = False self.selrect = None self.update() return super().mouseReleaseEvent(event) def mouseMoveEvent(self,event): if self.selrect: pos = event.position().toPoint() x,y = pos.x(),pos.y() dx,dy = x-self.x0,y-self.y0 self.selrect.x = self.rx0+dx self.selrect.y = self.ry0+dy self.update() return super().mouseMoveEvent(event) rects = Rects() win.setCentralWidget(rects) win.show() exit(app.exec()) ```