我的QGraphicsScene
已填充QGraphicsItems
,用户可以平移和缩放以检查所有各种QGraphicsItems
。但是,我希望QGraphicsTextItem
标签始终位于屏幕的左上角。忽略变焦很容易,因为我可以setFlags(QGraphicsItem::ItemIgnoresTransformations)
,但我还没弄明白如何强迫位置保持在左上角。什么是制作我的标签的最佳方式"漂浮"在同一个地方?
答案 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中所讨论的那样尝试让场景的一部分留在一个地方。
注意:正如另一个答案中所提到的,这个技巧通常不适用于硬件加速视图。在这些情况下,您需要将文本项目作为场景的一部分。