Заставляя QgraphicsItem оставаться на месте [дублировать
-
27-10-2019 - |
Вопрос
Этот вопрос уже имеет ответ здесь:
у меня есть QGraphicsScene
это наполнено QGraphicsItems
, и пользователь способен плыть и масштабировать, чтобы осмотреть все различные QGraphicsItems
. Анкет Однако я хотел бы иметь QGraphicsTextItem
Метка, которая всегда остается на месте в левом верхнем углу экрана. Игнорировать зумз легко, так как я могу просто setFlags(QGraphicsItem::ItemIgnoresTransformations)
, но мне еще предстоит выяснить, как заставить позицию остаться в верхней левой. Как лучше всего сделать мой лейбл «плавать» в том же месте?
Решение
Возможно, вы просто хотите регулярно использовать 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, как упоминает Арнольд Спенс в своем ответе. Тем не менее, это не сработает во многих ситуациях (например, если вы действительно хотите поместить метку на вершину вида Graphics, и вы используете ViewPort с OpenGL, ускоряемый).