Я получил от обоих 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. Если кто-то хочет посмотреть на все это, дайте мне знать.
ОК, так что я понял это. Просто не забудьте передать событие через метод базового класса. Просто! Это также работает для функций 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
Других решений пока нет …