使QGraphicsView平滑居中显示

3
我在Qt方面不是完全的新手,但有一些事情我不知道... 我用Python编程,但你可以使用任何语言回答。
我有几个QGraphicsItem(s),位于一个QGraphicsScene中,该场景通过普通的QGraphicsView查看。一切正常。
我的场景非常大,有10,000 x 10,000像素,所有图形项都散布在周围。
例如:
# 创建场景对象。 scene = QtGui.QGraphicsScene() scene.setSceneRect(0, 0, 10000, 10000) # 创建视图对象。 view = QtGui.QGraphicsView() view.setScene(scene)
# 向场景添加一些对象。 # scene.addItem(...) # ...
# 项列表。 items = scene.items()
# 这就是我如何居中显示项的方式。 view.centerOn(some_item) view.fitInView(some_item, Qt.KeepAspectRatio)
我的问题是,如何使用类似于centerOn的东西将视图居中于每个项上,但平滑移动?
目前,centerOn在下一个项上快速移动,我想要缓慢移动它,也许使用缓动曲线的QPropertyAnimation?
我尝试使用大循环中的view.translate(1,1)将视图移动到下一个项,但移动太快了,就像centerOn一样。
我尝试在翻译之间使用time.sleep(0.01)等待一段时间,但窗口会阻塞直到循环结束...所以这很糟糕。
非常感谢!
2个回答

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 才能使其按照我想要的方式运行。


1
我通过将setSceneRect的值设定得很高来解决了我的问题,然后将场景居中在一个对象或位置上。
例如:
this->ui->graphicsView->setSceneRect(0,0,100000000,100000000); this->ui->graphicsView->centerOn(500,1030);
设置setSceneRect的大小后,GraphicsView无法正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接