3

QGraphicsViewに画像を読み込んだQGraphicsSceneが含まれています。私のアプリは、ユーザーにこの画像に注釈を付けさせて、この画像のユーザーの注釈領域の座標情報を取得できるようにします。よりわかりやすくするために、私はこの写真を作成します。

ここに画像の説明を入力してください

必要なのは、画像の座標に基づいた正確な座標情報です。シーンにピックスマップを追加するため、画像とシーンの座標系は同じだと思います。しかし、QGraphicsViewとシーンは、写真のように座標が異なり、コンピューターでは幅が5ピクセル、高さが1ピクセル異なります(常にこれですか?)。

mapToScene関数を使用していますが、正しい座標情報を取得できません。

ここにコードを投稿します。

scene = new QGraphicsScene();
scene->addPixmap (pixmapItem);
ui->graphicsView->setScene (scene);


void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if ((event->button() == Qt::LeftButton)&& beginAnnotation) {
        .......   

        QPointF mousePoint = ui->graphicsView->mapToScene(event->pos());
        qDebug() << mousePoint;
    }
}

画像の左上隅をクリックすると、(0,0)が得られるといいのですが、代わりに(5,1)が得られます。

私を助けてください。

解決:

@effjaeは正しいと思います。私のmainWindowはmousrPressEventをキャプチャします。そして、Viewに含まれるシーンに画像をロードするときは、を使用しますui->graphicsView->adjustSize();。つまり、ViewとSceneは同じ座標系を共有していると思いますよね?このため、画像を次のように更新します。

ここに画像の説明を入力してください

今、私はeffjaeの提案を受け入れます。ViewにeventFilterをインストールしましたが、mouseClickの座標はView & Sceneに基づいています。ありがとうございました。

4

1 に答える 1

1

ここで発生している問題は、mousePressEventが実際のQGraphicsViewではなく、メインウィンドウから発生していることだと思います。mousePressEventは、ウィンドウの座標を提供します。これには、境界線や装飾が含まれます。

これを解決するには、MainWindowClassの場合とまったく同じ方法で、QGraphicsViewをサブクラス化し、そこでmousePressEventを処理します。

迅速ですが、おそらく魅力的ではない解決策は、QGraphicsViewにイベントフィルターをインストールすることです。これを行うには、QObjectのメソッドinstallEventFilterを使用します。

于 2012-07-12T10:10:35.063 に答える