Перемещение отображаемой сцены PyQt5 - PullRequest
0 голосов
/ 04 августа 2020

У меня есть QGraphicSscene в объекте QGraphicsView. В моей сцене вы можете рисовать области интереса, поэтому я постоянно отслеживаю положение мыши. Поскольку объекты часто не очень большие, вы можете увеличивать их, я хотел бы переместить отображаемую часть сцены, когда мышь находится на краю отображаемой сцены. С помощью event.scenePos() я получаю положение указателя мыши, но как я могу проверить, нахожусь ли я на краю сцены или нет?

Функции увеличения и уменьшения масштаба в моем коде выглядят следующим образом:

def zoomIn(self):
    self.view.scale(1.1, 1.1)
    # some other stuff

def zoomOut(self):
    # The initial zoom is always adapted to an image so that it is always larger or equal to the 
    # size of the GraphicsViews Object (therefore the image fills all areas). 
    if.self.currentZoom > 1: 
        self.view.scale(0.9, 0.9)
        # some other stuff

1 Ответ

3 голосов
/ 04 августа 2020

Чтобы определить, находится ли точка на краю, вы должны убедиться, что точка находится внутри прямоугольника области просмотра QGraphicsView, но за пределами меньшего прямоугольника, смещенного от предыдущего прямоугольника на несколько пикселей по всем краям:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        scene = QtWidgets.QGraphicsScene(self)
        self.view = QtWidgets.QGraphicsView(scene)
        self.setCentralWidget(self.view)

        self.view.viewport().setMouseTracking(True)
        self.view.scene().installEventFilter(self)

    def eventFilter(self, obj, event):
        if (
            obj is self.view.scene()
            and event.type() == QtCore.QEvent.GraphicsSceneMouseMove
        ):
            vp = self.view.mapFromScene(event.scenePos())
            if self.check_if_the_point_is_on_the_edge(vp, delta=10):
                print("on the border", event.scenePos())
        return super().eventFilter(obj, event)

    def check_if_the_point_is_on_the_edge(self, point, delta=1):
        rect = self.view.viewport().rect()
        internal_rect = rect.adjusted(delta, delta, -delta, -delta)
        return rect.contains(point) and not internal_rect.contains(point)


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    w.show()
    w.resize(640, 480)

    sys.exit(app.exec_())
...