Я получил как QGraphicsView, так и QGraphicsRectItem. Я перегрузил contextMenuEvent для обоих классов, чтобы предоставить всплывающие меню. Я хочу контекстное меню QGraphicsView, когда вы нажимаете на пробел во всплывающем меню QGraphicsItem, когда вы нажимаете на элемент.Qt: Pass QGraphicsSceneContextMenuEvent от QGraphicsView
В первой реализации я получил всплывающее окно 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
}
}
dynamic_cast для QGraphicsSceneContextMenuEvent терпит неудачу, поэтому я никогда не называю ContextMenuEvent для прямоугольника. Он не будет компилироваться, если я просто попытаюсь передать событие в rect-> contextMenu(), поэтому я попробовал трансляцию.
Каков правильный способ сделать это?
Это учебный проект, который просто создает/перемещает/поворачивает/удаляет 2D-формы с помощью Qt. Если кто-то хочет взглянуть на все это, дайте мне знать.
http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast говорит «dynamic_cast могут быть использованы только с указателями и ссылками на классы (или с недействительными *).» Возможно, стоит прочитать. –
Вы уже ответили на свой вопрос, но также смотрите на ['qgraphicsitem_cast'] (http://doc.qt.io/qt-5/qgraphicsitem.html#qgraphicsitem_cast) на будущее. – ilotXXI
Спасибо за подсказку. Это то, о чем я не знал. – cagem12