Заставьте QGraphicsView сделать плавный центр - PullRequest
3 голосов
/ 05 ноября 2010

Я не новичок в Qt, но есть несколько вещей, о которых я не знаю ... Я программирую на Python, но не стесняйтесь публиковать свои ответы на ЛЮБОМ языке.

Итак,У меня есть несколько QGraphicsItem (s), расположенных внутри QGraphicsScene , сцена просматривается с обычным QGraphicsView .Все нормально.

Моя сцена очень большая, 10 000 x 10 000 пикселей, все графические элементы разбросаны вокруг.

Например:

 # Creating Scene object.
 scene = QtGui.QGraphicsScene()
 scene.setSceneRect(0, 0, 10000, 10000)
 # Creating View object.
 view = QtGui.QGraphicsView()
 view.setScene(scene)

 # Adding some objects to scene.
 # scene.addItem(...)
 # ...

 # The list of items.
 items = scene.items()

 # This is how i center on item.
 view.centerOn(some_item)
 view.fitInView(some_item, Qt.KeepAspectRatio)

Мой вопрос такой: как можно ли центрировать вид на каждом элементе, используя что-то похожее на centerOn , но плавно?

В настоящее время centerOn идет БЫСТРО на следующем элементе, я хочу переместитьЭто небрежно, может быть, используя QPropertyAnimation с кривой замедления?

Я пытался переместить представление к следующему элементу, используя view.translate (1, 1) в большомcicle, но движение слишком быстрое, точно так же как centerOn.

Я пытался поместить некоторое ожидание с time.sleep (0.01) между переводами, но блоки окон до тех пор, пока не существует cicle... так что это плохо.

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Однажды я использовал QTimeLine (с EaseInOutCurve), подключил его к слоту, а затем использовал это значение для преобразования прямоугольника вида, например:

const QRectF r = ...calculate rect translated by timeline value and trajectory...
view->setSceneRect( r );
view->fitInView( r, Qt::KeepAspectRatio );

Для траектории я использовал QLineF с начальной и конечной позицией для плавной прокрутки. Затем можно красиво использовать значение, испускаемое временной шкалой, с помощью QLineF :: pointAt ().

В моем случае мне нужно было настроить SceneRect и fitInView, чтобы он вел себя так, как я хотел.

1 голос
/ 18 апреля 2014

Я решил свою проблему, поместив высокое значение в setSceneRect. Затем я централизую сцену на объекте или позиции.

пример:

this-> ui-> graphicsView-> setSceneRect (0,0,100000000, 100000000); this-> ui-> graphicsView-> centerOn (500,1030);

С размером setSceneRect GraphicsView работает неправильно.

...