2012-04-24 31 views
0

Qtを初めて使用しているので、この質問をすることがあります。私はサブクラス化されたQGraphicsView内で画像をレンダリングしています。QGraphicsViewまたはQGraphicsSceneを使用して大きな画像内に画像をオーバーレイする

addPixmap()でPixmapとしてシーンに画像を追加しました。特定の場所にある大きな画像の上に小さい画像をオーバーレイ(blit)したいと思います。 addPixmap()を呼び出すことで、小さな画像をシーンに追加することもできますが、常に左上隅に表示されます。私はそれらの座標を自分で設定したいと思います。

どうすればこの問題を解決できますか?

ありがとうございます!

答えて

1

QGraphicsScene::addPixmapは、追加されたQGraphicsPixmapItemへのポインタを返します。あなたはその位置を設定したい場合は、このような何かを行うことができます。

QGraphicsPixmapItem *item = scene->addPixmap(yourPixmap); 
item->setPos(50, 50); // sets position to scene coordinate (50, 50) 

あなたが他の画像の上に画像をオーバーレイしたい場合は

、あなたはZ値について知っていることを確認してください。詳細は、 QGraphicsItem documentationを参照してください。基本的に、z値は積み重ね順序を決定します。

最後に、QGraphicsItemsの子育てに慣れてください。 QGraphicsItemに親アイテムがある場合、QGraphicsItemの座標は親の座標で表現されることを意味します。したがって、項目の位置が(0、0)で、シーン位置が(50,50)の項目の子である場合、子項目は(50,50)に表示されます。したがって、上の例では、次のようにすることができます。

これにより、親が「item」である新しい項目「childItem」が作成されます。その座標はまだ設定されていないので(0、0)、「アイテム」の子であるためシーン座標は(50,50)です。アイテムの親を指定する場合、子アイテムをシーンに追加する必要はありません。暗黙的に追加されます。

+0

したがって、大きな画像がシーン内でオフセットされている場合(四角形の枠内にある矩形の画像)、どのフレームがマウスイベントですか? QMouseEvent()がサブクラス化されたQGraphicsView内から(50,50)の座標を与えた場合、これらの座標はグラフィックスビューに対する相対座標ですか?これらの座標をより大きな画像内のピクセルに一致させるための簡単な(自動化された)方法はありますか? –

+0

はい、これらの座標はビューの座標です。 QGraphicsViewにはitemAt()メソッドがあり、指定された座標にあるアイテムへのポインタを返します。これは親アイテムでも子供であってもかまいません。QGraphicsItem :: parentItemを試して、アイテムに親があるかどうかを調べることができます。 QGraphicsItem、QGraphicsScene、QGraphicsViewのマッピング関数をご覧ください。座標を変換する簡単な方法があります。また、[The Graphics View Coordinate System](http://qt-project.org/doc/qt-4.8/graphicsview.html)をご覧ください。 – Anthony

+0

少なくとも私の経験では、QGraphicsViewをサブクラス化するよりも、QGraphicsItem(あなたのケースではQGraphicsPixmapItem)やQGraphicsSceneをサブクラス化する方がずっと便利です。これらはすべてマウスハンドラを持っています。 – Anthony

関連する問題