2011-08-21 7 views
6

Qt Graphics보기, 이미지 표시! , 위젯

다음은 내 코드입니다.

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

당신은 그들이 범위에서 갈 때, 그렇지 않으면 삭제 얻을, 힙에 대한 모든 객체를 생성해야합니다

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

두 번째 질문과 관련이있을 수 있습니다 - sceneui->graphicsView에 할당되지만 즉시 삭제됩니다 이후, 힙에 모든 오브젝트를 다시 작성하십시오.

+0

메모리 누수가 발생하지 않도록하려면 어떻게해야합니까? : =) 나는 메모리를 풀어야 만한다. :) –

+0

예. 삭제로 직접 정리해야합니다. 클래스 포인터 변수로 QGraphicsScene (및 QGraphicsPixmapItem을 additem 동안 복사하지 않는다면)을 선언하는 것이 좋습니다. 그런 다음 변수를 선언 할 때 스마트 포인터를 사용하는 것이 좋습니다. 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

이것은 가장 느리고 잔인한 작업입니다. –