|
2 | 2 | import math |
3 | 3 |
|
4 | 4 | from PyQt5.QtCore import Qt, QRectF, QEvent, QCoreApplication, QObject, QPointF |
5 | | -from PyQt5.QtGui import QBrush, QPalette, QTransform |
| 5 | +from PyQt5.QtGui import QBrush, QPalette, QTransform, QPolygonF |
6 | 6 | from PyQt5.QtWidgets import ( |
7 | 7 | QGraphicsView, QGraphicsScene, QWidget, QVBoxLayout, QSizePolicy, |
8 | 8 | QScrollBar, QGraphicsDropShadowEffect |
@@ -218,7 +218,8 @@ def __updateView(self, view: QGraphicsView, rect: QRectF) -> None: |
218 | 218 | container.setVisible(False) |
219 | 219 | return |
220 | 220 | # map the rect to (main) viewport coordinates |
221 | | - viewrect = self.mapFromScene(rect).boundingRect() |
| 221 | + viewrect = qgraphicsview_map_rect_from_scene(self, rect).boundingRect() |
| 222 | + viewrect = viewrect.toAlignedRect() |
222 | 223 | viewportrect = self.viewport().rect() |
223 | 224 | visible = not (viewrect.top() >= viewportrect.top() |
224 | 225 | and viewrect.bottom() <= viewportrect.y() + viewportrect.height()) |
@@ -248,6 +249,20 @@ def viewportEvent(self, event: QEvent) -> bool: |
248 | 249 | return super().viewportEvent(event) |
249 | 250 |
|
250 | 251 |
|
| 252 | +def qgraphicsview_map_rect_from_scene( |
| 253 | + view: QGraphicsView, rect: QRectF |
| 254 | +) -> QPolygonF: |
| 255 | + """Like QGraphicsView.mapFromScene(QRectF) but returning a QPolygonF |
| 256 | + (without rounding). |
| 257 | + """ |
| 258 | + tr = view.viewportTransform() |
| 259 | + p1 = tr.map(rect.topLeft()) |
| 260 | + p2 = tr.map(rect.topRight()) |
| 261 | + p3 = tr.map(rect.bottomRight()) |
| 262 | + p4 = tr.map(rect.bottomLeft()) |
| 263 | + return QPolygonF([p1, p2, p3, p4]) |
| 264 | + |
| 265 | + |
251 | 266 | def main(args): # pragma: no cover |
252 | 267 | # pylint: disable=import-outside-toplevel,protected-access |
253 | 268 | from PyQt5.QtWidgets import QApplication, QAction |
|
0 commit comments