2 Stimmen

Pyqt: Wie kann man ein Element immer in die Mitte einer QGraphicsView setzen, wenn Scrollen möglich ist?

Ich habe eine QGraphicsView. Dazu habe ich eine QGraphicsScene und dazu eine QPixmap(*.jpeg) und QGraphicsEllipseItem(ein Kreis). Die QPixmap ist viel größer als die QGraphicsView, daher ist das Scrollen aktiviert. Das Problem ist, dass sich sowohl QPixmap als auch QGraphicsEllipseItem bewegen. Ich möchte aber eine feste Position für das QGraphicsEllipseItem in QGraphicsView. Es sollte immer in der Mitte der QGraphicsView sein. Wie kann ich das erreichen? Hoffe jemand kann helfen.

1voto

Aaron Digulla Punkte 308693

Fügen Sie einen Signalhandler für das Bildlaufsignal der Bildlaufleisten hinzu (verwenden Sie QAbstractSlider::sliderMoved() ).

Dann können Sie die Ansicht nach ihrem linken/oberen Offset und ihrer Größe abfragen und den Kreis entsprechend positionieren. Siehe die Erklärung für QAbstractScrollArea um Ihnen den Einstieg zu erleichtern.

1voto

Whatang Punkte 8642

Wenn Sie die Unterklasse QGraphicsView können Sie die Option scrollContentsBy Methode, um die Position der Ellipse zu bestimmen, wenn sich der Bildlaufbereich ändert. Hier ist ein wirklich minimaler Code:

import sys
from PyQt4 import QtGui

class MyView(QtGui.QGraphicsView):
    def __init__(self, scene, parent = None):
        super(MyView, self).__init__(parent)
        self.scene = scene
        self.setScene(scene)
        self.ellipse = QtGui.QGraphicsEllipseItem(0, 0, 30, 30, scene = self.scene)
        self.scene.addItem(self.ellipse)

    def scrollContentsBy(self, x, y):
        super(MyView, self).scrollContentsBy(x, y)
        self.ellipse.setPos(self.mapToScene(28, 28))

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)
        pixmap = QtGui.QPixmap()
        pixmap.load('imagefile.jpg')
        scene = QtGui.QGraphicsScene(self)
        scene.setSceneRect(0, 0, pixmap.width(), pixmap.height())
        item = QtGui.QGraphicsPixmapItem(pixmap)
        scene.addItem(item)
        self.view = MyView(scene, self)
        self.view.setMinimumSize(100, 100)

def main():
    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    app.exec_()

if __name__ == '__main__':
    main()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X