2011-08-21 105 views
6

這裏是我的代碼: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(); 
    } 

}

我想從文件顯示的圖像,代碼工作正常,但圖像disappiars非常快。

如何暫停圖像屏幕?

如何在「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

您需要創建在堆上的所有對象,否則當他們走出去的範圍,他們被刪除:

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

你的第二個問題可能與 - scene分配給ui->graphicsView,但它被立即刪除之後,再次在堆上創建所有對象。

+0

而如何避免內存泄漏? :=)我必須釋放內存權? :) –

+0

是的,你需要清理自己與刪除。我建議你聲明你的QGraphicsScene(和QGraphicsPixmapItem,如果它不在additem期間被複制)作爲類指針變量。然後我會建議你在聲明變量時使用某種智能指針,例如QSharedPointer: QSharedPointer ptr_scene; this-> ptr_scene = QSharedPointer (new QGraphicsScene()) 然後當MainWindow關閉時管理內存。 – thomas

6

如果你不需要堅持使用QGraphicsView,可以使用QLabel代替。我沒能解決它的QGraphicsView ...

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

這是最慢和過度操作。 –