Encuentre la posición de la pantalla de un QGraphicsItem

Caso de uso: Esto debería ser un problema bastante común. En un QMainWindow normal con QMdiArea vive un mdiChild con un QGraphicsView. Esta vista muestra una QGraphicsScene con QGraphicsItems dentro. Un clic derecho en uno de estos elementos selecciona (enfoca) el elemento y abre un menú contextual, que se coloca convenientemente en las coordenadas de la pantallaQGraphicsSceneMouseEvent::screenPos(). Esto funciona como se esperaba.

Ahora me gustaría mostrar el mismo menú contextual cuando el usuario presiona una tecla (por ejemplo, Qt :: Key_Menu). Conozco el elemento seleccionado (enfocado), conozco la vista que muestra la escena.

Entonces mi pregunta es:
¿Cuál es la forma correcta de obtener la posición (en coordenadas globales de pantalla) de la representación visible de un QGraphicsItem dentro de una escena?

Aquí está lo que no funciona:

QGraphicsItem *item = ...; // is the currently selected item next to which the context menu shall be opened
QGraphicsScene *scene = ...; // is the scene that hosts the item
QGraphicsView *graphicsView = ...; // is the view displaying the scene, this inherits from QWidget

// get the position relative to the scene
QPointF sp = item->scenePos();
// or use
QPointF sp = item->mapToScene(item->pos());

// find the global (screen) position of the item
QPoint global = graphicsView->mapToGlobal(graphicsView->mapFromScene(sp));

// now
myContextMenu.exec(global);
// should open the context menu at the top left corner of the QGraphicsItem item, but it goes anywhere

El documento dice: Si desea saber en qué parte de la ventana gráfica se encuentra un elemento, puede llamar a QGraphicsItem :: mapToScene () en el elemento, luego QGraphicsView :: mapFromScene () en la vista.
¿Qué es exactamente lo que estoy haciendo, verdad?

Solo tropecé conun hilo en un foro alemán que sugiere:

QGraphicsView *view = item->scene()->views().last();

o incluso mejor:

QGraphicsView *view;
foreach (view,  this->scene()->views())
{
    if (view->underMouse() || view->hasFocus()) break;
}
// (use case in the forum thread:) // QMenu *menu = new QMenu(view);

Usar eso podría permitir una respuesta más generalizada a mi pregunta ...

Respuestas a la pregunta(6)

Su respuesta a la pregunta