迫使QGraphicsItem保持不变

rcv*_*rcv 7 c++ qt qt4 qgraphicsview qgraphicsitem

我有一个QGraphicsScene充满了QGraphicsItems,用户可以平移和缩放以检查所有各种QGraphicsItems.但是,我希望 QGraphicsTextItem标签始终位于屏幕的左上角.我可以忽略变焦很容易,setFlags(QGraphicsItem::ItemIgnoresTransformations)但我还没弄明白如何强迫位置保持在左上角.什么是让我的标签"浮动"在同一个地方的最佳方法?

use*_*511 6

我认为唯一(可行)的方法是每帧重新计算文本项的位置.为此,只需子类化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);
}
Run Code Online (Sandbox Code Playgroud)

我已经多次这样做了,而且效果很好.

当然,你可以在他的回答中创建像Arnold Spence一样的正常QLabel.但是,这在许多情况下都不起作用(例如,如果您确实要将标签放在图形视图的顶部,并且您正在使用OpenGL加速的视口).


Arn*_*nce 3

也许您只是想在视图上放置一个常规的权利,而不是像本问题QLabel中讨论的那样尝试使场景的一部分留在一个地方。

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