2013-10-14 80 views
0

我正在經典的QgraphicsView/QGraphicsScene/QGraphicsItem框架。後來PyQt QgraphicsItem上下文菜單被QGraphicsView覆蓋Contextmenu

self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
    self.customContextMenuRequested.connect(self.__contextMenu) 

然後: 我在的QGraphicsView聲明上下文菜單

# --------------------------------------------------------------------------- 
def __contextMenu(self, position): 
    """ """ 
    # ----> Creating Context menu ----------------------------------- 
    oTreeMenu = QtGui.QMenu() 

    etc ... 

然後在實例化的QGraphicsItem I類使用的ContextMenuEvent類似如下:

# --------------------------------------------------------------------------- 
def contextMenuEvent(self, event): 
    """ """ 
    # ----> Creating Context menu ----------------------------------- 
    oTreeMenu = QtGui.QMenu() 

問題是QGraphicsItem事件被QGraphicsView完全覆蓋。 我應該如何着手解決這兩個問題?

回答

0

我找到了一個解決方案:

我使用QGraphicsScene的ContextMenuEvent而不是2個他人。 在我檢查鼠標是否在QGraphicsItem之上的事件中,我構建了相應的菜單。

我不太喜歡這個解決方案,因爲我所有的功能都在QGraphicsScene類下,大多數功能都是關於物品而不是場景。所以這是一種混亂,但它的作品。

仍然希望看到更好的解決方案。

0

我這樣做是在C++,但我認爲它應該幫助

在GraphicsView:

void MyGraphicsView::contextMenuEvent(QContextMenuEvent * event) 
{ 
    QGraphicsView::contextMenuEvent(event); 
    if(!event->isAccepted()) 
    { 
     QMenu * menu = new QMenu; 
     menu->addAction("GraphicsView Action 1"); 
     menu->addAction("GraphicsView Action 2"); 
     menu->popup(event->globalPos()); 
    } 
} 

在GraphicsItem:

void MyGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) 
{ 
    QMenu *menu = new QMenu; 
    menu->addAction("Action 1"); 
    menu->addAction("Action 2"); 
    menu->popup(event->screenPos()); 
    event->setAccepted(true); 
}