【问题标题】:Make QGraphicsView do smooth centerOn使 QGraphicsView 做平滑 centerOn
【发布时间】:2011-05-05 12:08:47
【问题描述】:

我在 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 存在......所以这很糟糕。

非常感谢!

【问题讨论】:

    标签: qt pyqt qgraphicsview


    【解决方案1】:

    我曾经使用过 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 以使其表现得像我想要的那样。

    【讨论】:

      【解决方案2】:

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

      示例:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-23
        相关资源
        最近更新 更多