3

我在 Qt 中并不是真正的新手,但有一些我不知道的事情......我正在使用 Python 编程,但请随时用任何语言发布您的答案。

所以,我有几个QGraphicsItem (s),位于QGraphicsScene内,使用普通QGraphicsView查看场景。一切正常。

我的场景非常大,10,000 x 10,000 像素,所有图形项目都分散在周围。

例如 :

# 创建场景对象。
 场景 = QtGui.QGraphicsScene()
 场景.setSceneRect(0, 0, 10000, 10000)
 # 创建视图对象。
 视图 = QtGui.QGraphicsView()
 view.setScene(场景)

 # 将一些对象添加到场景中。
 # 场景.addItem(...)
 # ...

 # 项目列表。
 项目 = 场景。项目()

 # 这就是我以项目为中心的方式。
 view.centerOn(some_item)
 view.fitInView(some_item, Qt.KeepAspectRatio)

我的问题是,如何使用类似于centerOn的东西将视图集中在每个项目上,但又很顺利?

目前,centerOn 在下一个项目上运行很快,我想慢慢移动它,也许使用QPropertyAnimation 和缓动曲线?

我尝试在一个大圆圈中使用view.translate(1, 1)将视图移动到下一个项目,但移动速度太快,就像 centerOn 一样。

我试图在翻译之间用time.sleep(0.01)进行一些等待,但是窗口会阻塞,直到 cicle 存在......所以这很糟糕。

非常感谢 !

4

2 回答 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 以使其表现得像我想要的那样。

于 2010-11-05T11:04:00.527 回答
1

我通过在 setSceneRect 上设置高值解决了我的问题。然后我将场景集中在一个对象或位置上。

例子:

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

使用 setSceneRect 大小 GraphicsView 无法正常工作。

于 2014-04-17T20:25:45.537 回答