Pyqt6 QgraphicsView: Zoom at Mouse Position сбрасывается в центр с индивидуальным панорамированиемPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pyqt6 QgraphicsView: Zoom at Mouse Position сбрасывается в центр с индивидуальным панорамированием

Сообщение Anonymous »

Описание задачи < /h2>
Я реализую пользовательский pyqt6 qgraphicsview с функциональностью масштабирования и панорамирования. Когда я увеличиваюсь или выходит, используя колесо мыши, представление правильно масштабируется, но затем немедленно сбрасывается в центр сцены вместо того, чтобы поддерживать положение под курсором мыши. Мне нужно, чтобы положение мыши была фиксированной во время увеличения при поддержании своих пользовательских реализаций панорамирования. /> My WheelEvent реализация: < /p>
def wheelEvent(self, event: QtGui.QWheelEvent):
zoomInFactor = 1.25
zoomOutFactor = 1 / zoomInFactor

# Get the scene position before scaling
oldPos = self.mapToScene(event.position().toPoint())

# Determine zoom direction
if event.angleDelta().y() > 0:
zoomFactor = zoomInFactor
new_zoom = self._zoom + 1
else:
zoomFactor = zoomOutFactor
new_zoom = self._zoom - 1

# Check zoom limits
if new_zoom > self.MAX_ZOOM or new_zoom < self.MIN_ZOOM:
return

# Apply zoom
self.scale(zoomFactor, zoomFactor)
self._zoom = new_zoom

# Get the new position under mouse after scaling
newPos = self.mapToScene(event.position().toPoint())

# Move scene to delta to keep mouse position fixed
delta = newPos - oldPos
self.translate(delta.x(), delta.y())

# Adjust scrollbar ranges based on zoom level
self.updateScrollBarRanges()
< /code>
и моя функция обновления диапазона прокрутки: < /p>
def updateScrollBarRanges(self):
# Get current transform scale
scale = self.transform().m11()

# Base range that stays within 32-bit integer limits
MAX_RANGE = 2000000000 # Slightly less than 2147483647 for safety

# Calculate new range based on scale
# When zoomed out (scale < 1), increase the range
# When zoomed in (scale > 1), decrease the range
adjusted_range = int(min(MAX_RANGE * (1 / scale), MAX_RANGE))

# Set new ranges for both scrollbars
self.horizontalScrollBar().setRange(-adjusted_range, adjusted_range)
self.verticalScrollBar().setRange(-adjusted_range, adjusted_range)
< /code>
My Panning реализация в MousePressevent: < /p>
def mousePressEvent(self, event: QtGui.QMouseEvent):
# Check for Ctrl + Left Button
if (
self.pan_mode == "ctrl_left"
and event.modifiers() == QtCore.Qt.KeyboardModifier.ControlModifier
and event.button() == QtCore.Qt.MouseButton.LeftButton
):
self._ctrlLeftDrag = True
self._lastDragPoint = event.pos()
self.viewport().setCursor(
QtGui.QCursor(QtCore.Qt.CursorShape.ClosedHandCursor)
)
event.accept()
return

elif (
self.pan_mode == "middle_mouse"
and event.button() == QtCore.Qt.MouseButton.MiddleButton
):
self._ctrlLeftDrag = True # Reuse the same drag logic
self._lastDragPoint = event.pos()
self.viewport().setCursor(
QtGui.QCursor(QtCore.Qt.CursorShape.ClosedHandCursor)
)
event.accept()
return
< /code>
Что я попробовал < /h2>
Я попытался сделать несколько подходов: < /p>

[*] Отключение якорей трансформации и вручную применение переводов < /li>
/> Установка настройки настраивающих якорей преобразования (в настоящее время использует Anchorundermouse) Положение
[*] ctrl+левый щелчок и паннинг среднего щелчка должен продолжать работать
[*] Диапазоны прокрутки должны быть обновлены во время увеличения для больших сцен
. Сетка и координированная функция марки /> < /ol>
Вопрос < /h2>
Как я могу реализовать функцию qgraphicsview Zoom, которая поддерживает позицию курсора в качестве якорной точки Zoom без сброса в центр сцены, в то же время правильно обновляя бренд Scroll и сохранение моей обычной функциональности? /> pyqt6 < /li>
python 3.x < /li>
< /ul>
** Я заметил, что проблема возникает, когда полосы прокрутки не имеют места прокрутки ** < /p>

Подробнее здесь: https://stackoverflow.com/questions/795 ... omized-pan
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Pyqt6 QgraphicsView: Zoom at Mouse Position сбрасывается в центр с индивидуальным панорамированием
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Vuetify: justify-position/align-position vs justify="position"/align="position"
    Anonymous » » в форуме CSS
    0 Ответы
    75 Просмотры
    Последнее сообщение Anonymous
  • В чем разница в Mouse.OverrideCursor и Mouse.SetCursor
    Anonymous » » в форуме C#
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • В чем разница в Mouse.OverrideCursor и Mouse.SetCursor
    Anonymous » » в форуме C#
    0 Ответы
    46 Просмотры
    Последнее сообщение Anonymous
  • Raycast от камеры до Mouse Position в Game World
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»