2011-08-21 6 views
6

Ecco il mio codice:Qt Graphics Visualizza, mostra l'immagine! , 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(); 
    } 

}

voglio visualizzare immagini da file, il codice funziona bene, ma immagine disappiars molto veloce.

Come posso mettere in pausa lo schermo dell'immagine?

E come posso caricare l'immagine nel widget "graphicsView"?

Il mio codice:

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

Non funziona.

Come risolvere il problema?

risposta

16

È necessario creare tutti gli oggetti sul mucchio, altrimenti vengono eliminati quando escono di portata:

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

tua seconda domanda potrebbe essere correlato - scene viene assegnato ui->graphicsView ma viene eliminato subito dopo, quindi, crea nuovamente tutti gli oggetti nell'heap.

+0

E come evitare la perdita di memoria? : =) Devo rilasciare la memoria giusto ¿? :) –

+0

Sì, è necessario pulirsi da soli con l'eliminazione. Ti suggerirei di dichiarare il tuo QGraphicsScene (e QGraphicsPixmapItem se non viene copiato durante l'additem) come variabile del puntatore di classe. E quindi suggerirei di utilizzare una sorta di puntatore intelligente quando dichiari la variabile, ad es. QSharedPointer: QSharedPointer ptr_scene; this-> ptr_scene = QSharedPointer (nuovo QGraphicsScene()) Quindi la memoria viene gestita quando la finestra principale è chiusa. – thomas

6

Se non è necessario attenersi a QGraphicsView, è possibile utilizzare invece QLabel. Non sono riuscito a risolverlo per QGraphicsView ...

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

Questa è l'operazione più lenta e eccessiva. –