强制QGraphicsItem保持不变

Forcing QGraphicsItem To Stay Put

本文关键字:QGraphicsItem 强制      更新时间:2023-10-16

我有一个用QGraphicsItems填充的QGraphicsScene,用户可以平移和缩放以检查所有不同的QGraphicsItems。然而,我想有一个QGraphicsTextItem标签,始终保持放在屏幕的左上角。忽略缩放很容易,因为我只需要setFlags(QGraphicsItem::ItemIgnoresTransformations),但我还没有弄清楚如何迫使位置保持在左上角。让我的标签"浮动"在同一个地方的最好方法是什么?

我认为唯一可行的方法是每帧重新计算文本项的位置。要做到这一点,只需子类化QGraphicsView,重写paintEvent并使用QGraphicsView::mapToScene()来计算新的位置。比如:

void MyGraphicsView::paintEvent(QPaintEvent*)
{
    QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
    m_textItem->setPos(scenePos);
}

我已经这么做过很多次了,效果很好。

当然你可以像Arnold Spence在他的回答中提到的那样创建普通的QLabel。然而,这在很多情况下是行不通的(例如,如果你真的想在图形视图的顶部放置标签,并且你正在使用opengl加速的视口)。

也许你只是想在视图上放一个常规的QLabel,而不是像这个问题中讨论的那样试图让场景的一部分停留在一个地方。

注意:正如在另一个答案中提到的,这个技巧通常不适用于硬件加速视图。在这些情况下,你需要使文本项成为场景的一部分。