Erstellen und Entfernen eines Qt-Widget-Objekts

7

Ich habe gehört, dass die Widgets auf dem Heap (unter Verwendung von new) zugewiesen werden sollen, und dann müssen sie nicht mehr gelöscht werden (das geschieht automatisch).

  1. Kann jemand erklären, warum?
  2. Was passiert, wenn ein Widget nicht auf diese Weise, sondern auf einem Stapel zugeordnet wird?

Ich bin mir nicht sicher, ob es wichtig ist, aber alle Widgets, die ich erstelle, haben ein Elternteil.

Das sagt:

  

Wenn parent 0 ist, wird das neue Widget   ein Fenster. Wenn Eltern ein anderes Widget ist,   Dieses Widget wird zu einem untergeordneten Fenster   innerhalb des Elternteils. Das neue Widget ist   gelöscht, wenn das übergeordnete Element gelöscht wird.

    
BЈовић 24.11.2010, 14:26
quelle

2 Antworten

20

Es ist keine Magie involviert. Einfach gesagt, ein QObject löscht automatisch seine Kinder in seinem Destruktor. Solange also Ihr Widget einen Elternteil hat und Sie diesen Elternteil zerstören, müssen Sie sich keine Sorgen um die Kinder machen. Wenn Sie sich also gefragt haben, was dieser QObject * parent -Parameter ist, nun, dafür ist er da.

Auch aus dem doc:

  
    

Alle untergeordneten Objekte werden gelöscht. Wenn eines dieser Objekte im Stapel oder global ist, stürzt Ihr Programm früher oder später ab.

  

Vermeiden Sie es daher, Eltern Objekte zu geben, die einem Stack zugeordnet sind.

    
Etienne de Martel 24.11.2010, 14:34
quelle
3

Die Dokumente dazu sind hier . Der Grund dafür, dass sie am häufigsten auf dem Heap zugewiesen werden, besteht darin, Probleme zu vermeiden, die durch die Konstruktionsreihenfolge der Mitglieder des Objektbaums verursacht werden. Der Stack ist in Ordnung, solange Sie die Regeln befolgen, aber warum sollten Sie sich bemühen, wenn Sie eine zuverlässige Alternative haben?

Die Referenz @Etienne zitiert ist hier .

    
Steve Townsend 24.11.2010 15:21
quelle

Tags und Links