как перемещаться по сцене с помощью мыши
я хочу перемещаться по сцене с помощью мыши а не с скролБаром. я сделал код для скролАреи недавно там он прекрасно работает сегодня я пытался сделать это в сцене. Скопировал код из файла и вставил в данный и отредоктировал но нечего не работает. пытался понять что не так я заметил что 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 . я отслеживал с момента нажатия мыши положение мыши и в соответствие с условием добавлял к скролбаром Сцены значения