2016-07-30 18 views
0

Ich habe von QGraphicsView und QGraphicsRectItem abgeleitet. Ich habe das contextMenuEvent für beide Klassen überladen, um Popup-Menüs bereitzustellen. Ich möchte das QGraphicsView-Kontextmenü, wenn Sie auf ein Leerzeichen klicken, das QGraphicsItem-Popup-Menü, wenn Sie auf ein Element klicken.Qt: Pass QGraphicsSceneContextMenuEvent von QGraphicsView

Bei der ersten Implementierung bekam ich das QGraphicsView Popup, egal wo ich geklickt habe. So modifizierte ich die contextMenuEvent wie folgt:

void CustomGraphicsView::contextMenuEvent(QContextMenuEvent* event) 
{ 
    if (QGraphicsItem *item = itemAt(event->pos())) { 
    MyRect* rect = dynamic_cast<MyRect*>(item); 
    QGraphicsSceneContextMenuEvent* context_event = dynamic_cast<QGraphicsSceneContextMenuEvent*>(event); 
    if (rect && context_event) 
     rect->contextMenuEvent(context_event); 
    } 
    else { 
    QMenu menu; 
    ... create the QGraphicsView popup menu 
    } 
} 

Die dynamic_cast für die QGraphicsSceneContextMenuEvent nicht so dass ich nie die contextMenuEvent für das rect nennen. Es wird nicht kompiliert, wenn ich versuche, das Ereignis an das rect-> contextMenu() zu übergeben, also habe ich den Cast ausprobiert.

Was ist der richtige Weg?

Dies ist ein Lernprojekt zum Erstellen/Verschieben/Drehen/Löschen von 2D-Formen mit Qt. Wenn jemand das Ganze sehen möchte, lass es mich wissen.

+0

http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast sagt „dynamic_cast kann nur mit Zeigern und Referenzen auf Klassen (oder mit void *) verwendet werden.“ Es könnte eine Lektüre wert sein. –

+0

Sie haben bereits auf Ihre Frage geantwortet, sehen aber auch ['qgraphicsitem_cast'] (http://doc.qt.io/qt-5/qgraphicsitem.html#qgraphicsitem_cast) für die Zukunft. – ilotXXI

+0

Danke für den Tipp. Das ist eine, von der ich nichts wusste. – cagem12

Antwort

0

OK, also habe ich es herausgefunden. Stellen Sie nur sicher, dass das Ereignis über die Basisklassenmethode übergeben wird. Einfach! Dies funktioniert auch für die Funktionen mousePressEvent(), mouseMoveEvent() und mouseReleaseEvent.

void CustomGraphicsView::contextMenuEvent(QContextMenuEvent* event) 
{ 
    // if the event is on a GGraphicsItem just pass the event along 
    if (itemAt(event->pos())) { 
    QGraphicsView::contextMenuEvent(event); 
    } 
    else 
    { 
    QMenu menu; 
    ... create popup for the CustomGraphicsView