2016-07-30 205 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