2016-07-30 6 views
0

Я получил как 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. Если кто-то хочет взглянуть на все это, дайте мне знать.

+0

http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast говорит «dynamic_cast могут быть использованы только с указателями и ссылками на классы (или с недействительными *).» Возможно, стоит прочитать. –

+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 

 Смежные вопросы

  • Нет связанных вопросов^_^