2011-08-21 10 views
6

Aquí está mi código:Qt Graphics View, show image! , 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(); 
    } 

}

quiero mostrar una imagen de archivo, el código funciona bien, pero disappiars imagen muy rápido.

¿Cómo puedo pausar la pantalla de imagen?

¿Y cómo puedo cargar la imagen en el widget "graphicsView"?

Mi código:

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

No funciona.

¿Cómo solucionar esto?

Respuesta

16

lo necesario para crear todos los objetos en el montón, de lo contrario, se borran cuando salen del ámbito de aplicación:

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

Su segunda pregunta podría estar relacionado - scene se asigna a ui->graphicsView pero se elimina inmediatamente después, así que vuelva a crear todos sus objetos en el montón.

+0

Y cómo evitar la pérdida de memoria? : =) Tengo que liberar memoria ¿verdad? :) –

+0

Sí, tendrás que limpiarte con delete. Le sugiero que declare su QGraphicsScene (y QGraphicsPixmapItem si no se copia durante el additem) como una variable de puntero de clase. Y le sugiero que utilice algún tipo de puntero inteligente cuando declare la variable, p. QSharedPointer: QSharedPointer ptr_scene; this-> ptr_scene = QSharedPointer (new QGraphicsScene()) Luego, la memoria se administra cuando MainWindow se cierra. – thomas

6

Si no tiene que quedarse con QGraphicsView, una posibilidad es usar QLabel en su lugar. No logré resolverlo para QGraphicsView ...

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

Esta es la operación más lenta y exagerada. –