2012-05-26 26 views

Odpowiedz

10

QGraphicsView to widżet służący do wyświetlania zawartości QGraphicsScene. Dlatego właściwym miejscem do implementacji menu kontekstowego (menu podręcznego) jest QGraphicsView.

Trzeba reimplement funkcja ContextMenuEvent jest własne klasy odziedziczone QGraphicsView:

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

Zobacz także Qt Menus Example.

+0

Dzięki! Udało się, ale musiałem wprowadzić pewne zmiany. 1. Po pierwsze, ponieważ mój typ projektu to Qt GUI Application, musiałem zastąpić dany QGraphicsView swoim własnym. Zrobiłem to ręcznie edytując plik .ui i zastępując nazwę klasy obiektu. 2. Użyłem następującego przykładu dla podklasy QGraphicsView: http://doc.trolltech.com/4.3/graphicsview-elasticnodes.html. Musiałem zmodyfikować konstruktor, aby zawierał parametr dla widżetu nadrzędnego: GraphWidget (rodzic QWidget *) [...]. Następnie wystarczy zaimplementować menu kontekstowe w tej klasie. – TudorT

+0

Czy mogłem zrobić to inaczej, być może bez ręcznego ręcznego modyfikowania pliku .ui? – TudorT

+0

Możesz zmienić klasę widgetu z QGraphicsView na swoją własną klasę również w widoku projektu QtCreator za pomocą akcji "promuj do ..." w menu kontekstowym widgetu. –

7

Możesz ponownie wdrożyć metodę contextMenuEvent klasy QGraphicsScene, która daje dostęp do sceny współrzędnych oraz współrzędne ekranowe (w przeciwieństwie do QGraphicsView, która również działa, ale nie ma tej informacji):

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

To jest dobre rozwiązanie. Menu QMenu (to); nie działa. Możesz użyć menu QMenu (event-> widget()); aby aktywny widget służył jako rodzic QWidget w QMenu. – gamecreature

+1

Wygląda na to, że nie trzeba podawać menu rodzicowi. Menu menu QMenu() działa dobrze, ponieważ menu kontekstowe jest oknem samo w sobie i jest pozycjonowane we współrzędnych ekranu. –