2011-08-21 45 views
6

ここに私のコードはあります:Qt Graphics View、画像を表示! 、ウィジェット

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();  
    } 
} 

動作しません。

これを修正するには?

答えて

16

後で、再びすべてのオブジェクトをヒープ上に作成します。

+0

そして、どのようにメモリリークを避ける? :=)私は右のメモリを解放する必要がありますか? :) –

+0

はい、削除であなた自身をきれいにする必要があります。私はクラスポインタ変数としてQGraphicsScene(および追加項目の間にコピーされない場合はQGraphicsPixmapItem)を宣言することをお勧めします。そして、変数を宣言するときにスマートポインタを使用することをお勧めします。 QSharedPointer: <クラスヘッダ内> QSharedPointer ptr_scene; <ソースファイル内> this-> ptr_scene = QSharedPointer (新しいQGraphicsScene()) MainWindowを閉じるとメモリが管理されます。 – thomas

6

QGraphicsViewを使用する必要がない場合は、代わりにQLabelを使用してください。私はQGraphicsViewのためにそれを解決することができなかった...

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

これは最も遅く、過度の操作です。 –