Frage

Ich habe eine Qt App bekommt, dass Anwendungen QPointers neue UI Dialoge (Widgets) zu bringen. Der Haupt-App kann mit verschiedenen Daten geladen zahlreichen des gleichen Widget hat. Das Problem, das ich habe, ist, in dem Löschen und für jedes Widget die Speicher zu befreien. Wenn ich die RAM-Nutzung des Programms überwachen, jedes Mal, wenn ich die Taste, um offen eine dieser neuen Widgets klicken, erhöht es den Widder und wenn ich das Widget zu schließen, scheint es nicht zu befreien den Widder zu sein. Ich habe versucht, deleteLater und andere Lösungen verwenden, aber werden immer Abstürze im Programm.

Einige Codebeispiel ist hier:

QPointer<ListReservations> listResWindow = new ListReservations(resID);
listResWindow->setNum(numpeople);
listResWindow->show();

Dies wird die „ListReservations“ Widget nennen, die als QDialog deklariert wird (nicht modal). In diesem Dialog habe ich dann eine Taste, um das Fenster zu schließen, die den QWidget::close() Slot aufruft.

Ich denke, die Frage ist, wie sich mein Hauptprogramm (das die QPointer hat) wissen, wann der Dialog geschlossen und dann den Dialog befreien und (wenn möglich) löschen Sie den Zeiger noch mehr Speicher ...

speichern

Vielleicht haben Sie in der Lage könnte eine QConnect() zum QPointer Objekt zu tun, aber ich kann keine Signale oder Schlitze zu finden scheinen, dass die Weitergabe des Zeigers erlauben würde, viel weniger das Signal sendet, sobald der Dialog tatsächlich geschlossen ist und bereit zum Löschen.

Vielleicht brauche ich eine Art von Funktion im Hauptprogramm, das ein generischen Zeiger Objekt nimmt und habe dann den QDialog Anruf, dass es eigener enger Schlitz vor dem Aufruf? In dieser Funktion wäre es passiert selbst zerstört werden? Nur Ideen werfen, dass ich versucht habe, zu implementieren, aber scheiterte an ....

Ich glaube nicht, ich kann den gleichen Zeiger an anderer Stelle wiederverwendet werden, weil in der Theorie Sie mehr ListReservations Fenster gleichzeitig geöffnet haben.

War es hilfreich?

Lösung

Stellen Sie sicher, dass Sie den Qt::WA_DeleteOnClose Attribut-Flag auf Ihrem Dialog mit QWidget::setAttribute() eingestellt. Das sollte darauf achten, dass der Dialog richtig zerstört, wenn es geschlossen ist. Sehen Sie sich die Qt Dokumentation für weitere Details.

, dass der Speicher wird nun angenommen, richtig befreit, sollte der Zeiger selbst ungültig machen, aus der Qt-Dokumentation

  

Ein bewachten Zeiger, QPointer,   verhält sich wie eine normale C ++ Zeiger T *,   außer dass es automatisch auf ist   0, wenn das referenzierte Objekt ist   zerstört (im Gegensatz zu normalen C ++ Zeiger,   die sich „baumelnden Zeiger“ in   solche Fälle)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top