如何将QGraphicView翻译到我难以点击的位置?

时间:2018-05-16 12:16:40

标签: python pyqt pyqt5 qgraphicsview qgraphicsscene

我正在尝试将QGraphicView的位置转换为我双击的位置。我尝试了函数translatecenterOn但它们都不起作用。所以我在说我做错了什么。

举个简单的例子,如果我使用这段代码:

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())期间获得鼠标坐标。希望这是有效的。

现在我希望我得到的位置是视图的中心。所以我尝试使用translatecenterOn翻译视图,但没有任何事情发生。我也尝试将corrdinate映射到场景,但这对两者都没有帮助。

1 个答案:

答案 0 :(得分:1)

centerOn()只会使该位置可见,如果已经可见,则不会进行任何更改。解决方案是将sceneRect移动到按下的点上:

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