как перемещаться по сцене с помощью мыши

Рейтинг: 1Ответов: 0Опубликовано: 02.02.2023

я хочу перемещаться по сцене с помощью мыши а не с скролБаром. я сделал код для скролАреи недавно там он прекрасно работает сегодня я пытался сделать это в сцене. Скопировал код из файла и вставил в данный и отредоктировал но нечего не работает. пытался понять что не так я заметил что event обробатываеться тока при Enter. В остальных случаях он отвечает нет. мой код:

from PyQt5.QtCore import  QRect , QRectF , Qt , QPointF , QPoint , QEvent
from PyQt5.QtGui import  QColor , QBrush , QCursor , QMouseEvent
import sys
from PyQt5.QtWidgets import QGraphicsView , QGraphicsScene , QGraphicsWidget , QGraphicsEllipseItem 


class MoveObject(QGraphicsEllipseItem):
    brush = QtGui.QBrush(QtGui.QColor(31, 176, 224))
    def __init__(self , x , y , r ):
        super().__init__(0,0,r,r)
        self.setPos(x,y)
        self.setBrush(self.brush)
        self.setAcceptHoverEvents(True)
    def mousePressEvent(self, event) :
        pass
    def hoverEnterEvent(self, event ) :
        # app.instance().setOverrideCursor(qt.open)
        self.setCursor(QCursor(Qt.OpenHandCursor))
    def mouseMoveEvent(self, event) :
        cursor = event.lastScenePos()
        upCursor = event.scenePos()
        orig = self.scenePos()
        x= upCursor.x() - cursor.x() + orig.x()
        y = upCursor.y() - cursor.y() + orig.y()
        self.setPos(QPointF(x , y))


class main(QtWidgets.QWidget):
    
    def setupUI(self):
        self.resize(500,500)
        self.scene = QGraphicsScene(self)
        self.view = QGraphicsView(self)
        self.view.setScene(self.scene)
        self.scene.addItem(MoveObject(10,10,10))

        # self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        # self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scene.addItem(MoveObject(10,10,10))
        self.scene.addItem(MoveObject(10,10,10))
        self.view.setGeometry(QRect(0,0,450,450))
        self.view.installEventFilter(self)

    def eventFilter(self, obj , event):
        if obj is self.view :
            print(f"{event.type()} _move_ {QEvent.Type.MouseMove} _enter_ {QEvent.Type.MouseButtonPress} _realease_ {QEvent.Type.MouseButtonRelease}")
            print("yes" if event.type() in {QEvent.Type.MouseMove,QEvent.Type.MouseButtonPress,QEvent.Type.MouseButtonRelease} else "no")
            if event.type() == QEvent.Type.MouseMove:
                if self.start < event.x():
                    self.view.horizontalScrollBar().setValue(self.view.horizontalScrollBar().value()-1)
                    self.start = event.x()
                elif self.start > event.x():
                    self.view.horizontalScrollBar().setValue(self.view.horizontalScrollBar().value()+1)
                    self.start = event.x()

            elif event.type() == QEvent.Type.MouseButtonPress:
                self.start = event.x()
            elif event.type() == QEvent.Type.MouseButtonRelease:
                self.start = None

        return super().eventFilter(obj , event)

app = QtWidgets.QApplication(sys.argv)
ma = main()
ma.setupUI()
ma.show()
sys.exit(app.exec_())

я делаю без qt designer. при перетаскивание обьекта за пределы сцены сцена увеличиваеться и создаёт скролбары для перемещение по ней я же хочу убрать скролбары и перемещаться по сцене с помощью мыши для этого я попытался сделать через eventFIlter в классе main . я отслеживал с момента нажатия мыши положение мыши и в соответствие с условием добавлял к скролбаром Сцены значения

скролбары в сцене

Ответы

Ответов пока нет.