2016-08-23 1 views
0

J'ai un QGraphicsView à l'intérieur du MainWindow qui a implémenté un QGraphicScene. J'ai besoin de faire apparaître un widget lorsque je clique avec le bouton droit de la souris sur une certaine partie du QGraphicScene. Le parent du widget doit être MainWindow.Coordonnées d'accès du parent d'un widget

Mon problème est que je dois vérifier la validité de la partie sur witch je cliqué dans un mousePressEvent dans QGraphicScene et pour faire apparaître le widget exactement au même endroit, mais les coordonnées du QGraphicScene et MainWindow sont évidentes pas les mêmes . Pour cela j'utilise un signal personnalisé qui déclenche un slot à l'intérieur MainWindow et obtient les coordonnées du mousePressEvent du MainWindow. Le problème est que le mouseEvent du QGraphicsScene est déclenché avant le mouseEvent de MainWindow. Cela prend tout son sens et fonctionne si je clique deux fois sur le bouton droit de la souris, mais j'en ai besoin pour travailler dès le premier clic droit.

Je ne peux pas implémenter un filtre ou modifier le focus car j'ai des tonnes d'événements dans l'application.

QGraphicScene:

void CGraphicScene :: mousePressEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if(event -> button() == Qt::RightButton) 
    { 
     //test stuff 

     emit signalChangeContextualMenuPosition(); 
     m_contextualMenu -> show(); 
    } 
} 

MainWindow:

CGraphicScene *scene; 
    CContextualMenu *m_contextualMenu; 
    m_contextualMenu = new CContextualMenu(this); 
    m_contextualMenu ->close(); 
    scene = new CGraphicScene(m_contextualMenu); 

    ui->gvInterface -> setScene(scene); 
    connect(scene, SIGNAL(signalChangeContextualMenuPosition()), this, SLOT(openPopUp())); 

    void MainWindow :: openPopUp() 
    { 
     m_contextualMenu ->move(m_xCoordPopMenu, m_yCoordPopMenu); 
    } 

    void MainWindow :: mousePressEvent(QMouseEvent *event) 
    { 
     if(event -> button() == Qt::RightButton) 
     { 
      m_xCoordPopMenu = event -> x(); 
      m_yCoordPopMenu = event -> y(); 
     } 
    } 

Répondre

2

Utilisez le QGraphicsView::mapFromScene() pour cartographier les coordonnées scène aux coordonnées du widget de vue, puis QWidget::mapToParent() pour cartographier les coordonnées à son widget parent, ce qui est probablement votre fenêtre principale. Vous pouvez également trouver utile la méthode QWidget::mapTo().

+0

C'est une très bonne solution. Je parviens à envoyer le point où je souhaite faire apparaître le widget avec un signal à la MainWindow. Là, j'ai utilisé mapFromScene sur QGraphicsView avec ce point. – student