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.
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
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. –
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. –