2016-07-30 217 views
0

我從QGraphicsView和QGraphicsRectItem派生。我在這兩個類上重載了contextMenuEvent以提供彈出菜單。當你點擊一個項目時,點擊QGraphicsItem彈出式菜單的空白處時,我想要QGraphicsView上下文菜單。Qt:從QGraphicsView傳遞QGraphicsSceneContextMenuEvent

在第一次實現中,無論點擊哪個位置,我都會看到QGraphicsView彈出窗口。所以我修改了的ContextMenuEvent如下:

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 
    } 
} 

爲QGraphicsSceneContextMenuEvent的dynamic_cast的失敗,所以我從來不叫的ContextMenuEvent爲矩形。如果我只是嘗試將事件傳遞給rect-> contextMenu(),它就不會編譯,所以我嘗試了演員。

這樣做的正確方法是什麼?

這是一個使用Qt創建/移動/旋轉/刪除2D圖形的學習項目。如果有人想看看整個事情,請告訴我。

+0

http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast說:「dynamic_cast只能用於指針和類的引用(或void *)。」這可能值得一讀。 – 2016-07-30 15:53:48

+0

您已經回答了您的問題,但也請看['qgraphicsitem_cast'](http://doc.qt.io/qt-5/qgraphicsitem.html#qgraphicsitem_cast),以備將來。 – ilotXXI

+0

感謝您的提示。那是我不知道的。 – cagem12

回答

0

好吧,所以我想通了。只要確保通過基類方法傳遞事件。簡單!這也適用於mousePressEvent(),mouseMoveEvent()和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