使用例:これはかなり一般的な問題です。 QMdiAreaを持つ通常のQMainWindowには、QGraphicsViewを持つmdiChildが存在します。このビューにはQGraphicsSceneとQGraphicsItemsが表示されます。これらの項目の1つを右クリックすると項目が選択(フォーカス)され、コンテキストメニューが開きます。これは画面座標QGraphicsSceneMouseEvent::screenPos()
に配置すると便利です。これは期待どおりに動作しています。QGraphicsItemのスクリーン位置を見つける
ここで、ユーザーがキー(例: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
The doc says: あなたは、ビューポート内のアイテムがどこにあるかを知りたい場合は、あなたがQGraphicsItemを呼び出すことができます:: mapToScene()の項目に、そしてQGraphicsView: :ビューのmapFromScene()。
これはまさに私がやっていることですよね?
ちょうどにヒントa thread in a german forumつまずい:でも
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);
それは私の質問に、より一般的な答えを許すかもしれません使用して...
私は回答を投稿しようとしていましたが、ドキュメントを再読み込みすることで、私はあなたの分析に同意したと思います。QGraphicsView :: mapFromSceneは、ビューポートの座標(チェック価値がある)を与える必要があります。 MDI子のウィジェットのmapToGlobalに潜在的なバグがある場合にのみ質問があります。 –
@JamesTurnerだから、あなたの最初の推測は何でしょうか(これはあなたの回答で書かれたでしょう)? –