迫使QGraphicsItem保持不变

时间:2011-04-29 03:20:00

标签: c++ qt qt4 qgraphicsview qgraphicsitem

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

2 个答案:

答案 0 :(得分: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);
}

我已多次这样做,并且效果很好。

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

答案 1 :(得分:3)

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

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