2012-03-29 8 views
0

Ich möchte ein Bild in einem "funktionalen" Programmierstil anzeigen. Grundsätzlich bearbeite ich eine Reihe von Prozessen auf meinem Bild und manchmal möchte ich das Ergebnis anzeigen. So versuche ich:Wie zeige ich ein QImage in einem "funktionalen" Programmierstil an?

int display(string file, int argc, char *argv[]) 
{ 
    QApplication a1(argc,argv); 
    QImage myImage; 
    myImage.load(file.c_str()); 
    QLabel myLabel; 
    myLabel.setPixmap(QPixmap::fromImage(myImage)); 
    myLabel.show(); 
    return a1.exec(); 
} 
int main(int argc, char *argv[]) 
{ 
    MyImageDataStructure img; 
    img.erosion(5);//process 1 
    img.save("lenaero.png"); 
    display("lenaeor.png",argc,argv); // display the first result 
    img.dilation(5);//process 2 
    img.save("lenaopening.png"); 
    display("lenaopening.png",argc,argv); // display the second result 
    return 1; 
} 

Aber bei der zweiten Ausführung der Anzeigefunktion, tritt ein Fehler auf. Haben Sie irgendwelche Ideen, um dieses Problem zu lösen, während Sie diese Logik beibehalten?

Dank

Hinweis: Ich möchte nicht, externe Bibliotheken außer Qt schließen, und ich verstehe, dass ich außerhalb der Qt-Logik arbeiten möchten.

Antwort

2

Ich verstehe nicht wirklich, was Sie meinen "von einem Bild in einem functional Stil anzeigen". Ich denke, was du meinst ist, dass du eine Funktion haben willst, um den Anzeigeteil für ein Bild zu machen. In diesem Fall scheint es ein Missverständnis von Ihnen zu geben, was ein "funktionales" Paradigma tatsächlich ist.

Dennoch ist Ihr Problem sehr unterschiedlich. Sie müssen die QApplication Erklärung in die Hauptfunktion bewegen:

int main(...) { 
    QApplication a(argc, argv); 

    // ... 

} 

Und es aus der display() Funktion bewegen.

EDIT

ich Ihren Code erneut lesen, und es gibt damit eine Menge Dinge falsch. Sie sollten nicht jedes Mal eine separate Anwendung erstellen, wenn Sie ein Bild anzeigen möchten. Eine viel bessere Sache wäre die Verwendung eines QDialog. Erstellen Sie einen Dialog mit einem Etikett als Bild und rufen Sie jedes Mal show darauf auf, wenn Sie das Bild anzeigen möchten.

Nützliche Links:

http://qt-project.org/doc/qt-4.8/QDialog.html

http://sector.ynet.sk/qt4-tutorial/my-first-qt-gui-application.html (Nizza Überblick über die Erstellung und zeigt Dialoge)

+0

Dank Mann, Die Lösung dieses sein kann: int Anzeige (string file) { QImage myImage; myImage.load (Datei.c_str()); QLabel * myLabel = new QLabel; myLabel-> setPixmap (QPixmap :: fromImage (meinBild)); QVBoxLayout * Lay = Neu QVBoxLayout; lay-> addWidget (myLabel); QDialog * d = neuer QDialog; d-> setLayout (lay); Rückgabe d-> exec(); } – Vincent

+0

Nun, ich schlage vor, Sie tun das nicht, weil Sie einen sehr sehr schlimmen Fall von Speicherlecks haben. Sobald die Anzeigefunktion existiert, hast du keinen Zugriff mehr auf myLabel, lay, d usw. Diese Zeiger sind zerstört, aber die Daten, auf die sie zeigen, sind nicht zerstört. Und nachdem die Anzeige beendet ist, haben Sie absolut keine Möglichkeit, den Speicher freizugeben. Ich schlage vor, Sie extern QDialog Unterklasse und tun dies, oder speichern Sie diese Zeiger und geben Sie sie frei, wenn der QDialog beendet. –

+0

Oder Sie können weiterhin Ihre aktuelle Lösung verwenden, aber verbinden Sie einfach das 'Geschlossene' Signal des QDialogs mit dem' deleteLater' Slot Ihrer anderen Objekte wie QLayout, QLabel usw. –

Verwandte Themen