3

私はファイルから画像をロードするコードを書いており、この画像を編集して(いくつかのピクセルの値を変更して)ズームインまたはズームアウトしてから画像を保存しています。また、qgraphicsscen のクリックに関連付けられた元の画像の場所を知りたいです。今まで、便利な機能が見つかりませんでした。

画像をロードするための私のコード:

qgraphicsscene = myqgraphicsview->getScene();
qgraphicsscene->setSceneRect(image->rect());
myqgraphicsview->setScene(qgraphicsscene);
qgraphicsscene->addPixmap(QPixmap::fromImage(*image)); // this is the original image

編集用の私のコード:

mousePressEvent(QMouseEvent * e){
QPointF pt = mapToScene(e->pos());
scene->addEllipse(pt.x()-1, pt.y()-1, 2.0, 2.0,
QPen(), QBrush(Qt::SolidPattern));}

e->pos() と元の画像の正確な位置との関係を知りたいです。

4

1 に答える 1

5

GraphicsView で mousePressEvent を受け取るということは、MouseEvent で pos() を呼び出すと、ビューの座標空間内の点が返されることを意味します。

この時点で、ビューのmapToScene関数を使用して座標をシーン空間に変換し、シーンのitemAt関数を使用して、選択されたアイテムを見つけることができます。

返されたアイテムを使用して、アイテムのmapFromScene関数でクリックされたアイテムのローカル座標にシーン座標をマップできます。

したがって、GraphicsView では: -

mousePressEvent(QMouseEvent * e)
{
    // get scene coords from the view coord
    QPointF scenePt = mapToScene(e->pos());

    // get the item that was clicked on
    QGraphicsItem item* = qgraphicsscene->itemAt(pt, transform());

    // get the scene pos in the item's local coordinate space
    QPointF localPt = item->mapFromScene(scenePt);
}

画像のあるアイテムに対してローカルな位置を使用すると、そのスケールを元の画像にマッピングするだけです。

この方法で行うこともできますが、別のオプションとして、画像を格納する Qt クラスから継承し、そこで mousePressEvent を処理することもできます。これにより、シーン内でアイテムを見つけて自分で座標を変換する必要なく、アイテムのローカル空間での座標が得られます。

于 2014-03-13T09:24:57.443 に答える