Сделать QGraphicsView плавным по центру

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

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

Моя сцена очень большая, 10 000 х 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) в большом цикле, но движение слишком быстрое, как и centerOn.

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

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


person Cristi Constantin    schedule 05.11.2010    source источник


Ответы (2)


Однажды я использовал 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, чтобы он вел себя так, как я хотел.

person Frank Osterfeld    schedule 05.11.2010

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

пример:

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

С размером setSceneRect GraphicsView работает некорректно.

person Willyan    schedule 17.04.2014