def paintEvent(self, event: QPaintEvent) -> None:
if (self.contentsW == 0) or (self.contentsH == 0) or (self.viewportW == 0) or \
(self.viewportH == 0) or (self.viewportX >= self.contentsW) or (self.viewportY >= self.contentsH):
event.ignore()
return
norm = 100.0 / max(self.contentsW, self.contentsH, self.viewportW, self.viewportH)
normContentsWidth, normContentsHeight = round(self.contentsW * norm), round(self.contentsH * norm)
normViewportWidth, normViewportHeight = round(self.viewportW * norm), round(self.viewportH * norm)
normVieportX = min(round(self.viewportX * norm), normContentsWidth - normViewportWidth)
normViwportY = min(round(self.viewportY * norm), normContentsHeight - normViewportHeight)
cX1 = cY1 = 0
cX2, cY2 = normContentsWidth - 1, normContentsHeight - 1
vX1, vY1 = normVieportX, normViwportY
vX2, vY2 = normVieportX + normViewportWidth - 1, normViwportY + normViewportHeight - 1
painter = QPainter(self)
painter.setPen(QColor(255, 0, 255))
painter.drawLine(cX1, cY1, cX2, cY1)
painter.drawLine(cX2, cY1, cX2, cY2)
painter.drawLine(cX2, cY2, cX1, cY2)
painter.drawLine(cX1, cY2, cX1, cY1)
painter.setPen(QColor(0, 255, 0))
painter.drawLine(vX1, vY1, vX2, vY1)
painter.drawLine(vX2, vY1, vX2, vY2)
painter.drawLine(vX2, vY2, vX1, vY2)
painter.drawLine(vX1, vY2, vX1, vY1)
event.accept()