Pyqt: Как установить элемент всегда в центре QGraphicsView, когда возможна прокрутка? - PullRequest
2 голосов
/ 01 сентября 2010

У меня есть QGraphicsView.К этому я добавил QGraphicsScene, а к нему - QPixmap (*. Jpeg) и QGraphicsEllipseItem (круг).QPixmap намного больше, чем QGraphicsView, поэтому прокрутка включена.Проблема в том, что и QPixmap, и QGraphicsEllipseItem находятся в движении.Но я хочу фиксированную позицию для QGraphicsEllipseItem в QGraphicsView.Он всегда должен быть в центре QGraphicsView.Как я могу это сделать?Надеюсь, кто-то может помочь.

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Если вы создаете подкласс QGraphicsView, вы можете переопределить метод scrollContentsBy, чтобы задать положение эллипса при каждом изменении области прокрутки. Вот действительно минимальный код:

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()
1 голос
/ 01 сентября 2010

Добавьте обработчик сигнала для сигнала прокрутки полос прокрутки (используйте QAbstractSlider::sliderMoved()).

Затем вы можете запросить представление о его левом / верхнем смещении и размере и соответственно расположить окружность.См. Объяснение для QAbstractScrollArea , чтобы начать работу.

...