Qt: Передать QGraphicsSceneContextMenuEvent из QGraphicsView

Я получил от обоих 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
}
}

Dynamic_cast для QGraphicsSceneContextMenuEvent завершается ошибкой, поэтому я никогда не вызываю contextMenuEvent для прямоугольника. Он не скомпилируется, если я просто попытаюсь передать событие в rect-> contextMenu (), поэтому я попробовал приведение.

Как правильно это сделать?

Это учебный проект, позволяющий просто создавать / перемещать / вращать / удалять 2D фигуры, используя Qt. Если кто-то хочет посмотреть на все это, дайте мне знать.

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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]