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.
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. –
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
Danke für den Tipp. Das ist eine, von der ich nichts wusste. – cagem12