2011-08-21 3 views
6

Voici mon code:Qt Graphics Voir, montrer l'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(); 
    } 

}

Je veux afficher l'image du fichier, le code fonctionne très bien, mais l'image disappiars très rapide.

Comment mettre l'image en pause? Et comment est-ce que je peux charger l'image dans le widget "graphicsView"?

Mon code:

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

Il ne fonctionne pas.

Comment résoudre ce problème?

Répondre

16

Vous devez créer tous vos objets sur le tas, sinon ils sont supprimés quand ils sont hors de portée:

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

Votre deuxième question pourrait être liée - scene est affecté à ui->graphicsView mais il est supprimé immédiatement après, créez à nouveau tous vos objets sur le tas.

+0

Et comment éviter fuite de mémoire? : =) Je dois libérer la mémoire droite? :) –

+0

Oui, vous devrez nettoyer vous-même avec supprimer. Je suggère que vous déclariez votre QGraphicsScene (et QGraphicsPixmapItem s'il n'est pas copié pendant additem) en tant que variable de pointeur de classe. Et je suggère alors que vous utilisiez une sorte de pointeur intelligent lorsque vous déclarez la variable par ex. QSharedPointer: QSharedPointer ptr_scene; this-> ptr_scene = QSharedPointer (nouveau QGraphicsScene()) Ensuite, la mémoire est gérée lorsque MainWindow est fermé. – thomas

6

Si vous n'avez pas besoin de coller avec QGraphicsView, vous pouvez utiliser QLabel à la place. Je n'ai pas réussi à le résoudre pour QGraphicsView ...

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

C'est l'opération la plus lente et la plus surpuissante. –