web-dev-qa-db-ja.com

Qtグラフィックビュー、画像を表示! 、ウィジェット

これが私のコードです:

void MainWindow::on_actionOpen_Image_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());

    if(!fileName.isEmpty())
    {
        QImage image(fileName);

        if(image.isNull())
        {
            QMessageBox::information(this,"Image Viewer","Error Displaying image");
            return;
        }

        QGraphicsScene scene;
        QGraphicsView view(&scene);
        QGraphicsPixmapItem item(QPixmap::fromImage(image));
        scene.addItem(&item);
        view.show();   
    }

}

ファイルから画像を表示したいのですが、コードは正常に機能しますが、画像が非常に速く消えます。

画像画面を一時停止するにはどうすればよいですか?

また、「graphicsView」ウィジェットに画像をロードするにはどうすればよいですか?

私のコード:

void MainWindow::on_actionOpen_Image_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());

    if(!fileName.isEmpty())
    {
        QImage image(fileName);

        if(image.isNull())
        {
            QMessageBox::information(this,"Image Viewer","Error Displaying image");
            return;
        }

        QGraphicsScene scene;
        QGraphicsPixmapItem item(QPixmap::fromImage(image));
        scene.addItem(&item);

        ui->graphicsView->setScene(&scene);
        ui->graphicsView->show();    
    }
}

それは動作しません。

これを修正する方法は?

10
Davit Tvildiani

ヒープ上にすべてのオブジェクトを作成する必要があります。そうしないと、スコープ外になるとオブジェクトが削除されます。

QGraphicsScene* scene = new QGraphicsScene();
QGraphicsView* view = new QGraphicsView(scene);
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
scene->addItem(item);
view->show();

2番目の質問は関連している可能性があります-sceneui->graphicsViewに割り当てられていますが、すぐに削除されるため、ヒープ上にすべてのオブジェクトを再度作成します。

19
laurent

QGraphicsViewに固執する必要がない場合、1つの可能性は代わりにQLabelを使用することです。 QGraphicsViewでそれを解決できませんでした...

QString filename = "X:/my_image";
QImage image(filename);
ui->label->setPixmap(QPixmap::fromImage(image));
6
Cornelis