2012-05-26 171 views

回答

10

QGraphicsView是用於顯示QGraphicsScene內容的小部件。所以實現上下文菜單(彈出菜單)的正確位置是QGraphicsView。

你需要重新實現的ContextMenuEvent功能是你自己的類從繼承的QGraphicsView:

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

另見Qt的Menus Example

+0

謝謝!它的工作,但我需要做一些改變。 1.首先,因爲我的項目類型是Qt GUI應用程序,所以我需要用我自己的QGraphicsView替換。我通過手動編輯.ui文件並替換該對象的類名來完成此操作。 2.我爲QGraphicsView子類使用了以下示例:http://doc.trolltech.com/4.3/graphicsview-elasticnodes.html。我不得不修改構造函數以包含父窗口小部件的參數:GraphWidget(QWidget * parent)[...]。然後,簡單地在這個類中實現上下文菜單事件就可以實現。 – TudorT

+0

我可以以不同的方式做到這一點,也許不需要手動手動修改.ui文件? – TudorT

+0

您也可以在QtCreator的設計視圖中使用「小工具」的上下文菜單中的「promote to ...」動作將QGraphicsView中的窗口小部件類更改爲您自己的類。 – 2012-05-26 15:21:05

7

您可以重新實現QGraphicsScene類,這將給的contextMenuEvent方法訪問現場座標以及屏幕座標(相對於QGraphicsView,也可以工作,但沒有這個信息):

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

這是一個很好的解決方案。 QMenu菜單(this);不起作用。你可以使用QMenu菜單(event-> widget());讓活動小部件充當QMenu的QWidget父項。 – gamecreature

+1

實際上,似乎沒有必要給菜單一個父母。 QMenu menu()工作得很好,因爲上下文菜單本身就是一個窗口,並且正在屏幕座標中定位。 –

相關問題