Прокрутка QGraphicsView программно - PullRequest
2 голосов
/ 09 июля 2009

Я хочу реализовать функцию прокрутки / панорамирования в QGraphicsView в моем (Py) приложении Qt. Он должен работать следующим образом: пользователь нажимает среднюю кнопку мыши, и прокручивается представление, когда пользователь перемещает мышь (это довольно распространенная функция).
Я пытался использовать метод scroll (), унаследованный от QWidget. Однако вместо этого это как-то перемещает представление - полосы прокрутки и все. Смотри картинку.
Итак, учитывая, что я не должен делать это, как я должен? Или это правильный путь, но я делаю что-то еще не так? Код, который я использую:

   def __init__(self):
       ...

       self.ui.imageArea.mousePressEvent=self.evImagePress
       self.ui.imageArea.mouseMoveEvent=self.evMouseMove

       self.scrollOnMove=False
       self.scrollOrigin=[]

       ...

   def evImagePress(self, event):
        if event.button() == Qt.LeftButton:
            self.evImageLeftClick(event)
        if event.button() == Qt.MidButton:
            self.scrollOnMove=not self.scrollOnMove
            if self.scrollOnMove:
                self.scrollOrigin=[event.x(), event.y()]
   ...

   def evMouseMove(self, event):
        if self.scrollOnMove:
            self.ui.imageArea.scroll(event.x()-self.scrollOrigin[0],
                                     event.y()-self.scrollOrigin[1])

Это работает, как я ожидаю, за исключением всего бизнеса, связанного с перемещением виджетов.

Не в состоянии прокручивать http://img55.imageshack.us/img55/3222/scrollfail.jpg

Ответы [ 4 ]

4 голосов
/ 13 сентября 2010

Мое дополнение к методу translate (). Это прекрасно работает, если вы не масштабируете сцену. Если вы сделаете это, вы заметите, что изображение не синхронизировано с вашими движениями мыши. Вот когда mapToScene () приходит на помощь. Вы должны отобразить свои точки от событий мыши до координат сцены. Затем сопоставленная разница переходит к translate (), вуаля, ваша сцена с большой точностью следует вашей мышке.

Например:

QPointF tmp2 = mapToScene(event->pos());
QPointF tmp = tmp2.mapToScene(previous_point);
translate(tmp.x(),tmp.y());
3 голосов
/ 09 июля 2009

Я сам этого не делал, но это из QGraphicsView документации

... Когда сцена больше чем значения полос прокрутки, вы можете выберите использовать translate () для навигации вместо сцены.

Используя scroll вы перемещаете виджет, translate должен достичь того, что вы ищете, перемещая содержимое QGraphicsScene под видом

1 голос
/ 28 января 2015

Ответ, данный Денисом, является правильным, чтобы получить перевод на работу. Комментарий PF4Public также действителен: это может испортить масштабирование. Мой обходной путь отличается от P4FPublc - вместо mapToScene я сохраняю якорь и восстанавливаю его после перевода:

previousAnchor = view.transformationAnchor()
#have to set this for self.translate() to work.
view.setTransformationAnchor(QGraphicsView.NoAnchor)
view.translate(x_diff,y_diff)
#have to reset the anchor or scaling (zoom) stops working:
view.setTransformationAnchor(previousAnchor)
0 голосов
/ 10 июля 2009

Вы можете установить область QGraphicsScene, которая будет отображаться QGraphicsView с помощью метода QGraphicsView :: setSceneRect () . Поэтому, когда вы нажимаете кнопку и перемещаете мышь, вы можете изменить центр отображаемой части сцены и достичь цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...