from PyQt6.QtWidgets import QGraphicsScene, QGraphicsView, QSizePolicy from PyQt6 import uic, QtGui, QtCore from PyQt6.QtCore import Qt, QRect import math #https://forum.qt.io/topic/93327/how-can-i-use-qpainter-to-paint-on-qgraphicsview/5 #https://www.pythonguis.com/tutorials/pyqt6-bitmap-graphics/#qpainter # to solve the fit problem: https://stackoverflow.com/questions/61886358/qgraphicsview-fitinview-not-working-as-expected class EvtQGraphicsView(QGraphicsView): def __init__(self, scene): super().__init__(None) self.setScene(scene) def resizeEvent(self, event): self.fitInView(self.sceneRect(), Qt.AspectRatioMode.IgnoreAspectRatio) class EvtDrawerScene(QGraphicsScene): def __init__(self, env): self.gridWidth=2 super().__init__(None) self.env=env self.eventsRect=list() self.eventsList=list() def drawForeground(self, painter, rect): self.eventsList=self.env.listEventsOn(2024,10,1) self.eventsRect.clear() origXF, origYF, widthF, heightF = rect.getRect() origXI, origYI, widthI, heightI = (int(origXF),int(origYF),int(widthF),int(heightF)) self.drawEventsBG(painter,origXI, origYI, widthI, heightI) self.drawEventsText(painter,origXI, origYI, widthI, heightI) def drawEventsBG(self,painter,x,y,width,height): # Init Pen pen=QtGui.QPen() pen.setWidth(self.gridWidth) pen.setJoinStyle(Qt.PenJoinStyle.MiterJoin) po=int(self.gridWidth/2) # Pen offset painter.setPen(pen) # Init Brush brush=QtGui.QBrush() brush.setColor(QtGui.QColor("#e5e5e5")) brush.setStyle(Qt.BrushStyle.SolidPattern) painter.setBrush(brush) eventHeight=80 colorWidth=20 for e in self.eventsList: r=QRect(x+po,y+po,width-po*2,eventHeight-po*2) self.eventsRect.append(r) painter.drawRect(r) def drawEventsText(self,painter,x,y,width,height): font=painter.font() metric=QtGui.QFontMetrics(font); labelH=metric.boundingRect("Hello event").height() for i in range(0,len(self.eventsRect)): e=self.eventsList[i] r=self.eventsRect[i] painter.drawText(r.x(),r.y()+labelH,"Hello event") def setEvents(self, events): print(events) pass class EvtDrawer(): def __init__(self, layout, env): self.gs=EvtDrawerScene(env) self.gv=EvtQGraphicsView(self.gs) # Setup propertion spLeft=QSizePolicy(QSizePolicy.Policy.Preferred,QSizePolicy.Policy.Preferred); spLeft.setHorizontalStretch(1); self.gv.setSizePolicy(spLeft); # if jean: # spLeft=QSizePolicy(QSizePolicy.Policy.Preferred,QSizePolicy.Policy.Preferred); # spLeft.setHorizontalStretch(2); # self.gv.setSizePolicy(spLeft); # else: # spLeft=QSizePolicy(QSizePolicy.Policy.Preferred,QSizePolicy.Policy.Preferred); # spLeft.setHorizontalStretch(1); # self.gv.setSizePolicy(spLeft); layout.addWidget(self.gv) def setEvents(self,events): self.gs.setEvents(events)