Obligar a Qgraphicsitem para quedarse [duplicado
-
27-10-2019 - |
Pregunta
Esta pregunta ya tiene una respuesta aquí:
tengo un QGraphicsScene
que esta lleno de QGraphicsItems
, y el usuario puede transmitir y acercar para inspeccionar todos los diversos QGraphicsItems
. Sin embargo, me gustaría tener un QGraphicsTextItem
Etiqueta que siempre se queda en la parte superior izquierda de la pantalla. Ignorar los zooms es fácil, como puedo simplemente setFlags(QGraphicsItem::ItemIgnoresTransformations)
, pero todavía tengo que descubrir cómo forzar la posición para permanecer en la parte superior izquierda. ¿Cuál es la mejor manera de hacer que mi etiqueta "flote" en el mismo lugar?
Solución
Quizás solo quieras poner un regular QLabel
Justo en la vista en lugar de tratar de hacer que una parte de la escena permanezca en un lugar como se discutió en esta pregunta.
Nota: Como se menciona en otra respuesta, este truco a menudo no funcionará con vistas aceleradas de hardware. En estos casos, deberá hacer que los elementos de texto formen parte de la escena.
Otros consejos
Creo que la única forma (realable) de hacerlo es recalcular la posición para su elemento de texto en cada cuadro. Para hacer esto, simplemente subclase QGraphicsView, anule pintarvent y use QGraphicsView :: mapToscene () para calcular una nueva posición. Algo como:
void MyGraphicsView::paintEvent(QPaintEvent*)
{
QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
m_textItem->setPos(scenePos);
}
Lo he hecho muchas veces y ha funcionado muy bien.
Por supuesto, podría crear Qlabel normal como Arnold Spence menciona en su respuesta. Sin embargo, esto no funcionará en muchas situaciones (por ejemplo, si realmente desea colocar la etiqueta en la parte superior de la vista de gráficos y está utilizando la ventana de ventanas auditiva acelerada de OpenGL).