我从 QGraphicsView 和 QGraphicsRectItem 派生。我在两个类上重载了 contextMenuEvent 以提供弹出菜单。当你点击一个项目时,我想要 QGraphicsView 上下文菜单,当你点击空白时 QGraphicsItem 弹出菜单。
在第一次实现时,无论我点击哪里,我都会得到 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 失败,所以我从不为 rect 调用 contextMenuEvent。如果我只是尝试将事件传递给 rect->contextMenu(),它将无法编译,所以我尝试了强制转换。
这样做的正确方法是什么?
这是一个使用 Qt 创建/移动/旋转/删除 2D 形状的学习项目。如果有人想看整个事情,请告诉我。