我从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图形的学习项目。如果有人想看看整个事情,请告诉我。
http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast说:“dynamic_cast只能用于指针和类的引用(或void *)。”这可能值得一读。 – 2016-07-30 15:53:48
您已经回答了您的问题,但也请看['qgraphicsitem_cast'](http://doc.qt.io/qt-5/qgraphicsitem.html#qgraphicsitem_cast),以备将来。 – ilotXXI
感谢您的提示。那是我不知道的。 – cagem12