2011-08-21 17 views
6

Oto mój kod:Wyświetl grafikę Qt, pokaż obraz! Widget

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

}

chcę wyświetlić obraz z pliku, kod działa dobrze, ale disappiars obraz bardzo szybko.

Jak mogę wstrzymać obraz ekranu?

Jak mogę załadować obraz w widżecie "graphicsView"?

Mój kod:

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

To nie działa.

Jak to naprawić?

Odpowiedz

16

Musisz utworzyć wszystkie obiekty na stercie, inaczej zostaną usunięte, gdy wychodzą z zakresu:

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

Twoje drugie pytanie może być związane - scene jest przypisany do ui->graphicsView ale zostanie usunięty natychmiast po, więc ponownie stwórz wszystkie swoje obiekty na stercie.

+0

A jak uniknąć wycieku pamięci? : =) Muszę zwolnić pamięć w prawo ¿? :) –

+0

Tak, musisz wyczyścić się z usunięciem. Sugerowałbym, aby zadeklarować swoją QGraphicsScene (i QGraphicsPixmapItem, jeśli nie zostanie ona skopiowana podczas additem) jako zmienną wskaźnika klasy. I wtedy sugerowałbym użycie jakiegoś inteligentnego wskaźnika, gdy zadeklarujesz zmienną, np. QSharedPointer: QSharedPointer ptr_scene; this-> ptr_scene = QSharedPointer (new QGraphicsScene()) Następnie pamięć jest zarządzana po zamknięciu MainWindow. – thomas

6

Jeśli nie musisz trzymać się QGraphicsView, jedną z możliwości jest użycie QLabel. Nie udało mi się go rozwiązać dla QGraphicsView ...

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

Jest to najwolniejsza i największa operacja. –