Как мне перевести QGraphicView в положение, где я щелкнул мышью? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь перевести положение QGraphicView в положение, в котором я дважды щелкнул.Я попробовал функции translate и centerOn, но ни одна из них не работает.Так что, думаю, я делаю что-то не так.

Для простого примера, если я использую этот код:

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys



class SurfViewer(QMainWindow):
    def __init__(self, parent=None):
        super(SurfViewer, self).__init__()
        self.parent = parent
        self.setFixedWidth(600)
        self.setFixedHeight(600)
        photo = PhotoViewer()
        self.setCentralWidget(photo)


class PhotoViewer(QGraphicsView):
    def __init__(self, parent=None):
        super(PhotoViewer, self).__init__(parent)
        self.parent=parent
        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)
        self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
        self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.setFrameShape(QFrame.NoFrame)
        self.UpdateScene()
        self.scene.update()

    def mouseDoubleClickEvent(self, event):
        position = QPointF(event.pos())
        position = self.mapToScene(position.x(),position.y())
        print(position)
        print(position.isNull())
        if not position.isNull():
            #self.centerOn(position)
            print(position.x(),position.y())
            self.centerOn(position.x(),position.y())
            self.scene.update()
            self.update()

    def UpdateScene(self,):
        xsize=100
        ysize=100
        newitem = QGraphicsEllipseItem(0-xsize/2., 0-ysize/2., xsize, ysize)
        newitem.setBrush(QBrush(Qt.black, style = Qt.SolidPattern))
        self.scene.addItem(newitem)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = SurfViewer(app)
    ex.setWindowTitle('window')
    ex.show()
    sys.exit(app.exec_( ))

Я строю круг в середине вида.когда я дважды щелкаю по представлению, я ввожу функцию mouseDoubleClickEvent и получаю координату мыши во время щелчка с помощью QPointF(event.pos()).Надеюсь, это работает.

Теперь я бы хотел, чтобы позиция, которую я получил, была центром обзора.Поэтому я попытался перевести представление как translate, так и centerOn, но ничего не произошло.Я также пытаюсь сопоставить Кординат со сценой, но это тоже не помогло.

1 Ответ

0 голосов
/ 16 мая 2018

centerOn() только делает позицию видимой, если она уже видна, она не вносит никаких изменений. Решение состоит в том, чтобы переместить sceneRect, центрируя его по нажатой точке:

def mouseDoubleClickEvent(self, event):
    p = self.mapToScene(event.pos())
    r = self.sceneRect()
    r.moveCenter(p)
    self.setSceneRect(r)
...