Заставляя QgraphicsItem оставаться на месте [дублировать

StackOverflow https://stackoverflow.com/questions/5827479

Вопрос

Этот вопрос уже имеет ответ здесь:

у меня есть 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, ускоряемый).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top