Вариант использования: Это должно быть довольно распространенной проблемой.В обычном QMainWindow с QMdiArea живет mdiChild с QGraphicsView.Это представление отображает QGraphicsScene с QGraphicsItems внутри.Щелчок правой кнопкой мыши по одному из этих элементов выбирает (фокусирует) элемент и открывает контекстное меню, которое удобно расположено на экране с координатами QGraphicsSceneMouseEvent::screenPos()
.Это работает, как и ожидалось.
Теперь я хотел бы показать то же контекстное меню, когда пользователь нажимает клавишу (например, Qt :: Key_Menu).Я знаю выбранный (сфокусированный) элемент, знаю представление, в котором отображается сцена.
Итак, мой вопрос:
Как правильно определить положение (в глобальном, экранные координаты) видимого представления QGraphicsItem внутри сцены?
Вот что не работает:
QGraphicsItem *item = ...; // is the currently selected item next to which the context menu shall be opened
QGraphicsScene *scene = ...; // is the scene that hosts the item
QGraphicsView *graphicsView = ...; // is the view displaying the scene, this inherits from QWidget
// get the position relative to the scene
QPointF sp = item->scenePos();
// or use
QPointF sp = item->mapToScene(item->pos());
// find the global (screen) position of the item
QPoint global = graphicsView->mapToGlobal(graphicsView->mapFromScene(sp));
// now
myContextMenu.exec(global);
// should open the context menu at the top left corner of the QGraphicsItem item, but it goes anywhere
В документе сказано: ЕслиВы хотите знать, где в области просмотра находится элемент, вы можете вызвать QGraphicsItem :: mapToScene () для элемента, затем QGraphicsView :: mapFromScene () в представлении.
Это именно то, что яделаете, верно?
Просто наткнулся на ветку на немецком форуме , которая намекает на:
QGraphicsView *view = item->scene()->views().last();
или даже лучше:
QGraphicsView *view;
foreach (view, this->scene()->views())
{
if (view->underMouse() || view->hasFocus()) break;
}
// (use case in the forum thread:) // QMenu *menu = new QMenu(view);
Использование этого может дать более обобщенный ответ на мой вопрос ...