2012-05-26 21 views

Respuesta

10

QGraphicsView es el widget utilizado para mostrar los contenidos de QGraphicsScene. Entonces, el lugar correcto para implementar el menú contextual (menú emergente) es QGraphicsView.

Usted necesita volver a implementar la función ContextMenuEvent es su propia clase heredada de QGraphicsView:

void YourGraphicsView::contextMenuEvent(QContextMenuEvent *event) 
{ 
    QMenu menu(this); 
    menu.addAction(...); 
    menu.addAction(...); 
    ... 
    menu.exec(event->globalPos()); 
} 

Véase también el cuarto de galón de Menus Example.

+0

Gracias! Funcionó, pero necesitaba hacer algunos cambios. 1. En primer lugar, dado que mi tipo de proyecto es la aplicación Qt GUI, necesitaba reemplazar el QGraphicsView dado con el mío. Hice esto editando manualmente el archivo .ui y reemplazando el nombre de clase para el objeto. 2. Utilicé el siguiente ejemplo para la subclasificación QGraphicsView: http://doc.trolltech.com/4.3/graphicsview-elasticnodes.html. Tuve que modificar el constructor para incluir un parámetro para el widget padre: GraphWidget (QWidget * parent) [...]. Entonces simplemente implementar el evento del menú contextual en esta clase hizo el truco. – TudorT

+0

¿Pudo haberlo hecho de manera diferente, quizás sin tener que modificar manualmente el archivo .ui manualmente? – TudorT

+0

Puede cambiar la clase de widget de QGraphicsView a su propia clase también en la vista de diseño de QtCreator utilizando la acción "promocionar a ..." en el menú contextual del widget. –

7

puede volver a poner en práctica el método de la clase contextMenuEventQGraphicsScene, que le dará acceso a la escena coordenadas, así como las coordenadas de la pantalla (en oposición a QGraphicsView, que también trabaja pero no tiene esta información):

void YourGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) 
{ 
    // event->scenePos() is available 
    QMenu menu(this); 
    menu.addAction(...); 
    menu.addAction(...); 
    ... 
    menu.exec(event->screenPos()); 
} 
+1

Esta es una buena solución. Menú QMenu (esto); no funciona Puede usar el menú QMenu (event-> widget()); para que el widget activo sirva como QWidget principal de QMenu. – gamecreature

+1

En realidad, parece que no hay necesidad de dar al menú un padre. El menú QMenu() funciona muy bien, ya que el menú contextual es una ventana en sí mismo y se está posicionando en coordenadas de pantalla. –

Cuestiones relacionadas