2016-08-23 12 views
0

私はMainWindowの中にQGraphicsViewを持っていて、これはQGraphicSceneを実装しています。 QGraphicSceneの特定の部分を右クリックしてウィジェットをポップアップする必要があります。ウィジェットの親はMainWindowである必要があります。ウィジェットの親からの座標にアクセス

私の問題は、私は私がQGraphicScenemousePressEventの内側をクリック魔女の部分の有効性を確認するために、そして正確に同じ場所でウィジェットをポップアップする必要がありますが、QGraphicSceneMainWindowの座標が同じ明白ではないということです。そのためには、MainWindowのスロットをトリガするカスタム信号を使用し、mousePressEventMainWindowから座標を取得します。問題は、mouseEventQGraphicsScenemouseEventより前にトリガーされて、MainWindowになることです。これは完璧な意味を持ち、私が2度右クリックすると動作しますが、最初の右クリックから作業する必要があります。

アプリケーションに多数のイベントが含まれているため、フィルタを実装したり、フォーカスを変更することはできません。

QGraphicScene:

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

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

メインウィンドウ:

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(); 
     } 
    } 

答えて

2

シーンをマッピングするためにQGraphicsView::mapFromScene()を使用することは、おそらくあなたのあることだ親ウィジェットに座標をマッピングするためのビューウィジェットの座標に調整し、その後、QWidget::mapToParent()メインウィンドウ。また、便利な方法QWidget::mapTo()もあります。

+0

これは非常に素晴らしい解決策です。私はMainWindowへの信号でウィジェットをポップアップしたいところを送信することができます。 QGraphicsViewでmapFromSceneを使用しました。 – student

関連する問題