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.
Antworten
Zu viele Anzeigen?
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.
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()