2017-03-01 23 views
0

私はELFバイナリファイルの内部構造を表示するプロジェクトを持っています。私はQGraphicsViewとQGraphicsSceneを使用します。だから私はグラフィックスのシーンにブロックを表示することができますが、私はこのブロックの単一ブロックの表示内容をマウスでクリックする必要があります。私は使用機能を試しています:Qt QGraphicViewとQGraphicSceneマウスの位置

void MainWindow::mousePressEvent(QMouseEvent* event) 
{ 
    ui->textEdit->append(QString("x = %1, y = %2").arg(event->Pos().x()).arg(event->Pos().y())); 
} 

しかし、位置は全体のウィンドウで追跡しています。問題は、ウィンドウの幅と高さが動的であり、QGraphicsSceneの高さがウィンドウの幅よりも大きい可能性があるということです。だから私は単一のブロックを追跡することはできません。

私はいくつかの機能を試しました: mapFromScene、mapToScene、mapFromGlobal、...しかし、私はわかりません。どのように機能していますか?

位置はQGraphicalViewのスクロールバーとウィンドウのサイズで計算する必要がありますが、正確に計算するのは難しく、正しい解決策ではありません。

いくつかのアイデアは、どのようにグラフィックシーンで本当の位置を得るのですか?助けてくれてありがとう。

+0

あなたが望むものはあまり明確ではありません。これらの座標系はすべて互いに相対的であり、ウィジェットまたはシーン項目のmousePressEventの任意の実装に対して、そのオブジェクトの座標系で作業します。シーンの座標にマウスイベントが必要な場合は、QGraphicsScene :: mousePressEventを再実装します。ビューの座標にしたい場合は、QGraphicsView :: mousePressEventなどを再実装します。私はQGraphicsScene :: mousePressEventが適切な場所であることを暗示して「グラフィックシーンの真の位置」を読んでいますが、明確ではありません。 – goug

+0

ありがとう、私はそれを試してみましょう。 – cherioss

+0

トップレベルウィンドウでイベントを処理するのはなぜですか?グラフィックシーンシステムの目的は、対話できるアイテムを提供することです。あなたはアイテムそのものとあらゆる種類のやりとりをすることができます。それは簡単にできるように設計されています。 –

答えて

-1

QGraphicView(MyQGraphicView)を継承し、このオブジェクトのfunction mousePressedEventを宣言したmake myオブジェクトでこの問題を解決しました。これは私を助けます。

1

QGraphicsは他のグラフィックスフレームワークと同様に、複数の座標系を使用しており、座標を扱う際にはどのシステムを使用しているかを検討する必要があります。

QGraphicsSceneは、QGraphicsItem(または信号とスロットを使用する場合はQGraphicsObject')で表されるオブジェクトが存在する世界と考えることができます。

世界の地域を表示するには、1つまたは複数のQGraphicsViewを使用します。

異なる座標系間をマッピングするために、Qtは便利なmapTo関数とmapFrom関数を提供します。

先頭からQGraphicsViewを使用して座標を変換し、QGraphicsView::mapToSceneを使用してシーンの座標系の座標を取得できます。これから、アイテムがその座標にある場合、QGraphicsItem::mapFromSceneを使用してアイテムに対する座標を取得できます。

したがって、3つのレベル(ビュー、シーン、アイテム)で、座標がどのシステムにあるのか、どのレベルのシステムを扱っているのか考えることができます。

グラフィックシーンでどのように正しい位置を取得できますか?

うまくいけば、あなたは今、あなたがメインウィンドウで提供されている座標と考えるべきであるが、ビューの座標系であり、あなたはマップシーンの座標系したりすることができます。

QPointF scenePoint = mapToScene(event->Pos()); 

しかし、これは物事が複雑になり過ぎている、あなたはそれが簡単にQGraphicsScene座標を提供項目の独自のmouseMoveイベント/プレス/リリースイベントを、オーバーロードすることで、シーンとそれが含まれているアイテムを直接操作するために見つけることができます。

+0

ありがとうございます – cherioss

関連する問題