from PySide6.QtCore import QEvent, QObject, QPointF, QRect, QRectF, Qt from PySide6.QtGui import QColor, QMouseEvent, QPaintEvent, QPainter, QPen from PySide6.QtPdfWidgets import QPdfView from PySide6.QtWidgets import QApplication, QWidget def printParentHierarchy(obj: QObject, indent: int = 0): if obj: indentStr = ' ' * indent * 2 print(f"{indentStr}{obj.metaObject().className()}:{obj.objectName()}") printParentHierarchy(obj.parent(), indent + 1) return class scotusPdfView(QPdfView): drawing: bool start_point: QPointF end_point: QPointF def formatRect(self, rect: QRectF|QRect) -> str: return f"({rect.left()},{rect.top()}):({rect.right()},{rect.bottom()})" def __init__(self, parent: QWidget) -> None: self.drawing = False super(scotusPdfView, self).__init__(parent) print(self.viewport()) return def paintEvent(self, event: QPaintEvent) -> None: super(scotusPdfView,self).paintEvent(event) if self.drawing: page = self.pageNavigator().currentPage() viewport = self.viewport() painter = QPainter(viewport) doc = self.document() dpi = QApplication.primaryScreen().logicalDotsPerInch() # # XXX: Our mouse events are storing coordinates in the "self" # coordinate system. We need them in the viewport system # rect = QRectF(viewport.mapFrom(self, self.start_point), viewport.mapFrom(self, self.end_point)) redSolid = QPen(Qt.GlobalColor.red, 2, Qt.PenStyle.SolidLine) blueDash = QPen(Qt.GlobalColor.blue, 2, Qt.PenStyle.DashLine) greenDash = QPen(Qt.GlobalColor.green, 2, Qt.PenStyle.DashLine) painter.setPen(redSolid) painter.drawRect(rect) # Mouse drag box selectRect = QRectF(rect.left()/dpi*72, rect.top()/dpi*72, rect.right()/dpi*72, rect.bottom()/dpi*72) painter.setPen(blueDash) selection = doc.getSelectionAtIndex(page, 10, 50) selection = doc.getSelection(page, selectRect.topLeft(), selectRect.bottomRight()) bb = selection.boundingRectangle() painter.drawRect(bb) # Selection bounding box print(selection.text()) print() painter.setPen(greenDash) bb.setLeft(bb.left()/72*dpi) bb.setTop(bb.top()/72*dpi) bb.setRight(bb.right()/72*dpi) bb.setBottom(bb.bottom()/72*dpi) painter.drawRect(bb) # Selection translated into viewport coordinates? return def mousePressEvent(self, event: QMouseEvent) -> None: if event.button() == Qt.MouseButton.LeftButton: self.start_point = event.pos() self.drawing = True return def mouseMoveEvent(self, event: QMouseEvent) -> None: if self.drawing: pos = event.pos() self.end_point = pos viewport = self.viewport() viewport.update() return def mouseReleaseEvent(self, event: QMouseEvent) -> None: if event.button() == Qt.MouseButton.LeftButton: self.drawing = False self.viewport().update() return