0

質問にあるように、UI に QGraphicsView があります。その QGraphicsView に画像を配置する関数を作成しました。

// Read New Image from file
QImage image(":/images/myFile.png");

/// Declare a pointer to a scene
QGraphicsScene *scene = new QGraphicsScene();

// add a pixmap to the scene from the QImage 'image'
scene->addPixmap(QPixmap::fromImage(image));

// set the scene to equal the height and width of the map image
scene->setSceneRect(0,0,image.width(),image.height());

// Set the Scene to the GraphicsView on the UI
ui->graphicsView->setScene(scene);

ただし、画像上の特定の XY 値にドットをペイントできるようにしたいと考えています。私はこれを非常にうまく行う関数を持っていますが、この関数が呼び出されるとすぐにすべてのドットが表示され、画像が消えます:(.これは、シーンをドットがオンになっているシーンに再度設定するためであることがわかっているため、プログラムはただ取得します現在使用しているもの(画像のもの)を取り除く

    for(unsigned int i = 0; i < pixels.size(); i++)
    {
        x = pix_iter->second;
        y = pix_iter->first;

        scene->addEllipse(x, y, 1, 1, pen, QBrush(Qt::SolidPattern));

        pix_iter++;
    }
    ui->graphicsView->setScene(scene);

とにかく、新しいシーンを設定するのではなく、シーンを更新してドットを追加する方法がわかりません

どんな助けでも本当に感謝します。

4

2 に答える 2

3

2 番目のスニペットでは、シーンを再作成しますか? ui->graphicsView->scene()ドットを使用して追加しないのはなぜですか?

于 2013-04-18T08:20:19.943 に答える
2

同じシーン ポインタで操作する限り、setScene を何度でも呼び出すことができます (ただし、何も変更されません)。したがって、最初に理解しておくべきことは、QGraphicsScene は実際には QGraphicsView のモデルであるため、(アプリケーションの設計に応じて) グローバルに宣言するか、前の回答で提案されているように scene() メソッドを使用する必要があるということです。

もちろん、ビューに対して scene() を呼び出すことは解決策ですが、ビューのメソッドではなく、独自のクラスを介してモデル ポインターを利用できるようにしておくことを好みます。これは、アプリケーションの状態/ロジックに応じて異なるモデルを表示するビューを共有したい場合があるためです。そのため、シーンに何かを追加する必要がある場合は、作業しているシーンを確認する必要があります。

于 2013-04-18T08:27:23.003 に答える