У меня есть QGraphicsScene
, заполненный QGraphicsItems
, и пользователь может перемещаться и масштабировать, чтобы проверить все различные QGraphicsItems
. Однако я хотел бы, чтобы метка QGraphicsTextItem
всегда оставалась в левом верхнем углу экрана. Игнорировать масштабы легко, так как я могу только setFlags(QGraphicsItem::ItemIgnoresTransformations)
, но мне еще предстоит выяснить, как заставить позицию оставаться в левом верхнем углу. Как лучше всего сделать так, чтобы мой ярлык «плавал» в одном и том же месте?
Принуждение QGraphicsItem оставаться на месте
Ответы (2)
Возможно, вы просто хотите поместить обычный QLabel
прямо в представление вместо того, чтобы пытаться сделать так, чтобы часть сцены оставалась в одном месте, как описано в этот вопрос.
Примечание. Как упоминалось в другом ответе, этот трюк часто не работает с представлениями с аппаратным ускорением. В этих случаях вам нужно будет сделать текстовые элементы частью сцены.
Я думаю, что единственный (надежный) способ сделать это - пересчитывать позицию для вашего текстового элемента в каждом кадре. Для этого просто создайте подкласс 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);
}
Я делал это много раз, и это сработало очень хорошо.
Конечно, вы можете просто создать обычный QLabel, как упоминает Арнольд Спенс в своем ответе. Однако во многих ситуациях это не сработает (например, если вы действительно хотите поместить метку поверх графического представления и используете окно просмотра с ускорением OpenGL).