如何在QGraphicsView中超出滚动条范围进行平移?

9
我正在使用QGraphicsView构建一个节点图,并且目前正在实现平移功能。我参考了以下问题“如何在QGraphicsView中平移图像”开始实现,但是平移受到滚动条范围的限制。
我也尝试了translate方法,但结果相同。视图被限制在某个矩形区域内。
我希望可以无限制地平移,因为图形可能会很大,能够在场景的不同区域工作非常有用(这里有一个图形,那里有另一个图形等等)。

2
QGraphicsView可以用于可视化整个场景或其中的部分。当第一次显示视图时(通过调用QGraphicsScene :: itemsBoundingRect()),默认情况下会自动检测可视化区域。要自己设置可视化区域矩形,可以调用setSceneRect()。这将适当调整滚动条范围。请注意,尽管场景支持几乎无限的大小,但滚动条的范围永远不会超过整数的范围(INT_MIN,INT_MAX)。 - Tito Tito
@TitoTito谢谢你的代码提示和鼓励。但是,为了明确起见,除了为场景设置一个巨大的矩形外,没有明显的方法可以将视图居中于图形的任何节点上?例如,大型图形的第一个节点很可能靠近场景矩形边界,因此我需要设置一个比图形边界框大三倍的矩形才能够居中于任何节点。没有更简单的方法吗? - LBarret
1
@LionelBarret:想一想:滚动条需要有一个有限的范围。这个范围必须来自某个地方。你不需要设置一个“巨大”的矩形。你只需要设置一个包含所有已居中于每个节点的视口映射到场景矩形的矩形。然后它将恰好足够大,让你居中任何节点,而且不会更大。在基于单元格的电子表格中通常实现的替代解决方案是,在滚动到当前“场景”末尾时扩展“场景”(电子表格)的范围。你需要为此自定义QSceneView。 - Kuba hasn't forgotten Monica
谢谢。我理解滚动条的限制,但我更想知道是否可能完全没有它们的二维空间(在视觉和功能上)。空间划分和其他功能仍然可以正常工作。 - LBarret
3个回答

11
如果您观看这个视频,在三分钟的时间点,您将看到演示屏幕平移的效果。这里的应用程序是我开发的,虽然它没有显示出来,但当进行平移时,板子的可用空间似乎是无限的。

我所做的是创建了一个 32000 x 32000 的 QGraphicsScene,并将视图在 QGraphicsScene 的中心启动应用程序。测试团队花费了很长时间尝试平移到图形场景的边缘,每个人都放弃了——也许场景可以更小!

滚动条策略被设置为关闭,通过使用其 translate 函数移动 QGraphicsView,传递应用于 mouseMoveEvent 中的触摸或鼠标移动的增量来执行平移。

以这种方式完成,您不需要担心超出滚动条范围,创建一个非常大的 QGraphicsScene 也没有问题,因为它只是一个坐标空间。


1
谢谢,这就是我想要的答案。 - LBarret

1

我遇到了同样的问题。然而,将场景设置为某些大型的东西并让其空置不用并不是最佳选择。我已经开发了一种动态改变场景大小的方式,这样可以让你自由移动。你可以在这个其他的stackoverflow 回答 中找到它。


-5

你想绘制图表吗?试试这个Qt库 - QCustomPlot,它会为你节省数小时的辛苦工作。


1
这与所问的问题无关。图表和图形是两个不同的东西。 - Kuba hasn't forgotten Monica

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