如何使用 QGraphicsView 的 translate() 函数?

Posted

技术标签:

【中文标题】如何使用 QGraphicsView 的 translate() 函数?【英文标题】:How to use the QGraphicsView's translate() function? 【发布时间】:2013-01-14 15:45:05 【问题描述】:

这里我有一个场景和一个关联的视图,然后我在场景坐标中有一个位置。我想用这个位置设置视口的中心。我该怎么做?我尝试使用 translate() 函数,但它不起作用?

view->translate(10, 10);

视口应该随着 delta x 10 和 delta y 10 移动,但它不起作用!

【问题讨论】:

使用 QGraphicsView::centerOn 进行居中。翻译到底有什么不好的地方?场景的当前视口位置和尺寸是多少 (sceneRect())? 我也看到了同样的情况。我可以设置一个翻译的QTransform 或者我可以使用QGraphicsView::translate() 并且没有任何反应。有点令人沮丧。 【参考方案1】:

需要将图形视图的变换锚点模式设置为NoAnchor。

setTransformationAnchor(QGraphicsView::NoAnchor);

这可以防止图形视图按照其他锚模式(AnchorViewCenter、AnchorUnderMouse)的预期撤消翻译。

【讨论】:

【参考方案2】:

居中

正如Frank Osterfeld 所说,要将您的视口居中在给定位置,您可以简单地使用函数centerOn。

翻译

但要翻译你的视口,它存在另一种方式,包括改变你的滚动条位置:

// Your graphics view
QGraphicsView *view;

// dx, dy corresponds to your translation
int dx, dy;

// Change scrollbars position
view->horizontalScrollBar()->setValue( view->horizontalScrollBar()->value() + dx );
view->verticalScrollBar()->setValue( view->verticalScrollBar()->value() + dy );

渲染

如果需要,您还可以隐藏滚动条:

// Hide the scrollbars
view->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
view->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );

【讨论】:

【参考方案3】:

我使用了以下解决方法:

QTransform old_transform = transform();

QRectF scene_rect = scene()->sceneRect();
QRectF new_scene_rect(scene_rect.x()-translation.x(),
                      scene_rect.y()-translation.y(),
                      scene_rect.width(),scene_rect.height());
scene()->setSceneRect(new_scene_rect);

setTransform(old_transform);

变换部分是必要的,否则它会重置缩放。

这种解决方案本质上是在强制它改变允许查看的位置,这远非优雅。

我希望其他人提出一个明确的答案,允许按预期实际使用 translate 方法。

请注意,我使用的是 Qt 4.85,新版本可能会有所不同。

【讨论】:

【参考方案4】:

请参阅Bug Report, along with work around。

【讨论】:

总结从答案中的链接得出的结论很有帮助。

以上是关于如何使用 QGraphicsView 的 translate() 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QGraphicsView 的 translate() 函数?

如何在 QGraphicsView::Scale 之后调整 QGraphicsView 的大小

如何在鼠标正下方的 QGraphicsView 上正确放置小部件?

如何将 matplotlib 函数与 QGraphicsView 集成?

如何在 QGraphicsView 中重置比例?

如何在 QGraphicsView 中启用平移和缩放