1

これにより、QGraphicsSceneとQGraphicsViewの新しいタブで各画像を開きました

    void MainWindow::on_actionOpen_triggered()
    {
        QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::currentPath());
        if (!fileName.isEmpty()) {
           QImage image(fileName);
            if (image.isNull()) {
               QMessageBox::information(this, tr("Master Measure"),
                                tr("Cannot load %1.").arg(fileName));
               return;
            }

            scene = new QGraphicsScene;
            view = new QGraphicsView;

           view->setScene(scene);
           tabWidget->addTab(view,"someTab");

           scene->addPixmap(QPixmap::fromImage(image));
           scene->setBackgroundBrush(QBrush(Qt::lightGray, Qt::SolidPattern));

           QFileInfo fileInfo = fileName;
           tabWidget->setTabText(ui->tabWidget->count()-1, fileInfo.baseName());
           tabWidget->setCurrentIndex(ui->tabWidget->count()-1);
        }
    }

クリックして各画像に何かを描きたい。

だから私はクリックプレスイベントでこれをやった

void MainWindow::mousePressEvent(QMouseEvent *event)
{
     QPen pen(Qt::black);
     QBrush brush(Qt::red);
     pen.setWidth(6);
     scene->addEllipse(0,0,1000,500,pen,brush);
}

最後に開いた画像(タブ)に楕円を描くだけです。

この問題を解決する方法がわかりません。

どんなアイデアでも感謝します。ありがとうございました。

4

1 に答える 1

0

scene変数は、最後に作成されたシーンを指していることは明らかです。新しいシーンを作成すると、古いポインターはどこにも保存されないため失われます。したがって、すべてのシーンとビュー ポインターをどこかに保持し、現在表示されているオブジェクトを使用する必要があります。

すべてのタブの内容を担当するQGraphicsViewのサブクラス ( と呼びましょう)を作成することをお勧めします。MyViewファイル名をこのオブジェクトのコンストラクターに渡します。コンストラクターでシーンを作成し、メンバー変数に格納します。MyView::mousePressEvent描画を行うように再実装します。

次に、次のように新しいタブを追加できます。

MyView* view = new MyView(filename);
view ->addTab(view,"someTab");

ユーザーがビューをクリックすると、MyView::mousePressEventメソッドまたはそれぞれのMyViewオブジェクトが呼び出されます。各ビューには独自のscene変数のみが表示され、それぞれのシーンが編集されます。

于 2013-07-27T20:16:40.050 に答える