Wann sollte deleteLater verwendet werden?

9

Angenommen, ich habe das folgende Snippet, ist es sicher, deleteLater in qto's Destruktor für andere QT-Objekte, die es verwaltet, aufzurufen?

%Vor%

Weil ich einen ähnlichen Code wie diesen mit einem Leckdetektor analysiert habe und alle Objekte, für die deleteLater aufgerufen wurde, wurden nicht korrekt freigegeben, wenn ich den Aufruf nicht durch ein normales delete ersetzt habe. Wenn ich das richtig verstanden habe, registriert deleteLater nur ein Löschungsereignis in der QT-Nachrichtenwarteschlange. Kann dies das Problem sein, dass der Destruktor von qto am Ende des Bereichs von main aufgerufen wird, während die QT-Nachrichtenschleife bereits mit der Rückkehr von a.exec endet? Daher wird das Lösch-Ereignis niemals verarbeitet, tatsächlich nicht einmal in eine Nachrichten-Warteschlange geschoben, da es keine gibt?

    
user1709708 13.03.2014, 10:52
quelle

5 Antworten

4

Wie ich es verstehe, wird deleteLater am häufigsten verwendet, wenn Sie ein Objekt benötigen, das innerhalb des Anrufs zu einem Slot gelöscht werden soll. Wenn in diesem Fall delete verwendet wird und das Objekt bei der Rückkehr vom Slot referenziert wird, erfolgt ein Verweis auf nicht initialisierten Speicher.

Daher fordert deleteLater das zu löschende Objekt an, indem es eine Nachricht in die Ereignisschleife schreibt, die zu einem bestimmten Zeitpunkt verarbeitet wird, wenn es aus dem Slot zurückkehrt und gelöscht werden kann.

Ich erwarte, dass die Verwendung von deleteLater im Destruktor die Wahrscheinlichkeit erhöht, dass das Objekt den Gültigkeitsbereich verlässt, deleteLater für seine verwalteten Objekte aufruft, aber beendet wird, bevor die Ereignisschleife die Objekte löschen kann, wenn sie QApplication verlassen: : exec () beendet die Ereignisschleife.

    
TheDarkKnight 13.03.2014, 12:05
quelle
8
___ qstnhdr ___ Wann sollte deleteLater verwendet werden? ___ antwort22389262 ___

Im Allgemeinen gibt es eine Reihe von Umständen, unter denen deleteLater verwendet werden sollte. Höchstwahrscheinlich sollten Sie es einfach nicht benutzen.

Es ist ein Fehler, es im Destruktor von QObject für nicht untergeordnete Objekte zu verwenden. Wie Sie festgestellt haben, kann QObjects möglicherweise zerstört werden, ohne dass eine Ereignisschleife vorhanden ist. Es gibt keine deleteLater() -Aufrufe in Objektdestruktoren, zum Beispiel das longComputation() Qt-Modul.

Man muss hier vorsichtig sein: zum Beispiel ruft deleteLater() QTimer aufrufend QFutureWatcher auf, aber die Socket-Engine ist bereits ein Kind des Servers und wird trotzdem gelöscht durch %code% .

Soweit ich weiß, sollte %code% einen der folgenden Schritte ausführen:

  • mit einem intelligenten Zeiger wie %code% oder %code% ,
  • haben die Objekte als reguläre (Nicht-Zeiger-) Mitglieder,
  • Verwenden Sie rohe Zeiger und lassen Sie die Objekte untergeordnete Objekte sein.
___ answer22382257 ___

Sie haben Recht, dass der Befehl %code% nur von einer Ereignisschleife ausgeführt wird.

Aus der Qt-Dokumentation für %code% :

  

Plant dieses Objekt zum Löschen.

     

Das Objekt wird gelöscht, wenn die Steuerung zum Ereignis zurückkehrt   Schleife. Wenn die Ereignisschleife bei dieser Funktion nicht ausgeführt wird   aufgerufen (z. B. deleteLater () wird zuvor für ein Objekt aufgerufen   QCoreApplication :: exec ()), wird das Objekt gelöscht sobald der   Ereignisschleife wird gestartet. Wenn deleteLater () nach der Hauptereignisschleife aufgerufen wird   wurde gestoppt, das Objekt wird nicht gelöscht.   Seit Qt 4.8, wenn deleteLater () für ein Objekt aufgerufen wird, das in a lebt   Thread ohne laufende Ereignisschleife, das Objekt wird zerstört, wenn der   Faden beendet.

     

Beachten Sie, dass Sie eine neue Ereignisschleife eingeben und verlassen (z. B. durch Öffnen eines Modals)   Dialog) wird das verzögerte Löschen nicht ausführen; um das Objekt zu sein   gelöscht, muss das Steuerelement von wo aus in die Ereignisschleife zurückkehren   deleteLater () wurde aufgerufen.

     

Hinweis: Es ist sicher, diese Funktion mehrmals aufzurufen. wenn das   Das erste verzögerte Löschungsereignis wird übermittelt, alle ausstehenden Ereignisse für   Objekt wird aus der Ereigniswarteschlange entfernt.

Wenn alle untergeordneten Elemente %code% gelöscht werden sollen, wenn %code% gelöscht wird, stellen Sie sicher, dass sie mit %code% als übergeordnetes Element erstellt werden.

    
___ qstntxt ___

Angenommen, ich habe das folgende Snippet, ist es sicher, deleteLater in qto's Destruktor für andere QT-Objekte, die es verwaltet, aufzurufen?

%Vor%

Weil ich einen ähnlichen Code wie diesen mit einem Leckdetektor analysiert habe und alle Objekte, für die deleteLater aufgerufen wurde, wurden nicht korrekt freigegeben, wenn ich den Aufruf nicht durch ein normales delete ersetzt habe. Wenn ich das richtig verstanden habe, registriert deleteLater nur ein Löschungsereignis in der QT-Nachrichtenwarteschlange. Kann dies das Problem sein, dass der Destruktor von qto am Ende des Bereichs von main aufgerufen wird, während die QT-Nachrichtenschleife bereits mit der Rückkehr von a.exec endet? Daher wird das Lösch-Ereignis niemals verarbeitet, tatsächlich nicht einmal in eine Nachrichten-Warteschlange geschoben, da es keine gibt?

    
___ tag123qt ___ Qt ist ein plattformübergreifendes Anwendungsentwicklungs-Framework, das häufig für die Entwicklung von Anwendungssoftware verwendet wird, die auf verschiedenen Software- und Hardwareplattformen ohne oder mit nur geringer Änderung der zugrundeliegenden Codebasis ausgeführt werden kann. Qt ist sowohl mit kommerziellen als auch mit Open-Source-Lizenzen verfügbar. ___ tag123messagequeue ___ "Nachrichtenwarteschlange" ist ein Entwurfsmuster oder eine Softwareentwicklungskomponente, die Disziplin oder API für die Kommunikation zwischen zwei oder mehr miteinander verbundenen Prozessen oder Systemen definiert. Die Nachrichtenwarteschlange erzwingt asynchrone Verarbeitung und lose Kopplung. Abhängig von der Implementierung können sie auch Liefer- und Bestellgarantien der Nachrichten bereitstellen. Message-Processing-Garantien sind ausdrücklich vom Design ausgeschlossen. ___ answer22378104 ___

Wie ich es verstehe, wird deleteLater am häufigsten verwendet, wenn Sie ein Objekt benötigen, das innerhalb des Anrufs zu einem Slot gelöscht werden soll. Wenn in diesem Fall delete verwendet wird und das Objekt bei der Rückkehr vom Slot referenziert wird, erfolgt ein Verweis auf nicht initialisierten Speicher.

Daher fordert deleteLater das zu löschende Objekt an, indem es eine Nachricht in die Ereignisschleife schreibt, die zu einem bestimmten Zeitpunkt verarbeitet wird, wenn es aus dem Slot zurückkehrt und gelöscht werden kann.

Ich erwarte, dass die Verwendung von deleteLater im Destruktor die Wahrscheinlichkeit erhöht, dass das Objekt den Gültigkeitsbereich verlässt, deleteLater für seine verwalteten Objekte aufruft, aber beendet wird, bevor die Ereignisschleife die Objekte löschen kann, wenn sie QApplication verlassen: : exec () beendet die Ereignisschleife.

    
___ answer44523289 ___

Die Frage ist alt, aber ich werde das für die zukünftige Generation lassen) Die Antwort, die als Antwort markiert wurde, ist korrekt, aber seltsam formuliert. Eigentlich enthält deine Frage eine richtige Antwort:

  

Meldungsschleife endet bereits mit der Rückkehr von a.exec? Und so kam es dass der   Löschungsereignis wird nie verarbeitet, in der Tat nicht einmal in eine   Nachrichtenwarteschlange, da keine vorhanden ist.

Genau das passiert gerade. Alles %code% tut gerade ein Löschungsereignis in die outer Ereignisschleife. Wenn das Ereignis verarbeitet wird, wird das Objekt gelöscht. Wenn jedoch keine utter-Ereignisschleife vorhanden ist und später keine Ereignisschleife im Ausführungsablauf auftritt, wird das Ereignis nie gesendet. Daher wird das Objekt nie gelöscht.

Wenn Sie %code% im Destruktor des Objekts aufrufen und ein Objekt auf den Stack setzen - %code% wird aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt. In Ihrem Beispiel wird "out of scope" ausgeführt, wenn geschweifte Klammern von %code% function gefunden werden. Zu diesem Zeitpunkt hat %code% (welches die Hauptereignisschleife von Qt App darstellt) bereits - & gt; keine Ereignisschleife mehr zurückgegeben - & gt; %code% wurde aufgerufen, aber es ist nicht möglich, ein Löschungsereignis zu veröffentlichen. - & gt; Objekte sollten "deletedLater" niemals gelöscht werden ...

Was den Teil betrifft, in dem deleteLater () verwendet werden soll:

Kuba Ober antwortete:

  

Im Allgemeinen gibt es eine Reihe von Umständen, unter denen   deleteLater sollte verwendet werden. Wahrscheinlich sollten Sie einfach nicht verwenden   es ...

Hören Sie nicht darauf, es ist absolut falsch als die ganze Antwort. Was Sie tun sollten und was sollten Sie nicht besser entscheiden, nachdem Sie diesen Artikel gelesen haben. Es handelt sich zwar um Qt-Threads, aber der Artikel sagt auch etwas über asynchrone Programmierung aus (und, wie Emerald Weapon erwähnt, ist genau das, wofür deleteLater () erstellt wurde).

Außerdem haben intelligente Zeiger und QObject-Elternbesitz nichts damit zu tun, das Löschen mit %code% zu planen. Diese beiden Techniken verwenden tatsächlich eine einfache Operation %code% unter der Haube. Und wie der Artikel zeigt und wie die Emerald Weapon Antwort gezeigt hat: delete löst nicht die Probleme %code% . Wenn Sie also ein Objekt löschen müssen, verwenden Sie %code% , wenn Sie es für das Löschen einplanen müssen, verwenden Sie %code% .

Übrigens, wenn Sie einen intelligenten Zeiger mit %code% verwenden möchten, können Sie den Deleter angeben:

%Vor%

Und schließlich ist es ein NICHT ein Fehler, %code% im Destruktor von %code% für nicht untergeordnete Objekte zu verwenden.

    
___
Emerald Weapon 30.04.2016 20:30
quelle
3

Die Frage ist alt, aber ich werde das für die zukünftige Generation lassen) Die Antwort, die als Antwort markiert wurde, ist korrekt, aber seltsam formuliert. Eigentlich enthält deine Frage eine richtige Antwort:

  

Meldungsschleife endet bereits mit der Rückkehr von a.exec? Und so kam es dass der   Löschungsereignis wird nie verarbeitet, in der Tat nicht einmal in eine   Nachrichtenwarteschlange, da keine vorhanden ist.

Genau das passiert gerade. Alles deleteLater() tut gerade ein Löschungsereignis in die outer Ereignisschleife. Wenn das Ereignis verarbeitet wird, wird das Objekt gelöscht. Wenn jedoch keine utter-Ereignisschleife vorhanden ist und später keine Ereignisschleife im Ausführungsablauf auftritt, wird das Ereignis nie gesendet. Daher wird das Objekt nie gelöscht.

Wenn Sie deleteLater() im Destruktor des Objekts aufrufen und ein Objekt auf den Stack setzen - deleteLater() wird aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt. In Ihrem Beispiel wird "out of scope" ausgeführt, wenn geschweifte Klammern von main() function gefunden werden. Zu diesem Zeitpunkt hat a.exec() (welches die Hauptereignisschleife von Qt App darstellt) bereits - & gt; keine Ereignisschleife mehr zurückgegeben - & gt; deleteLater() wurde aufgerufen, aber es ist nicht möglich, ein Löschungsereignis zu veröffentlichen. - & gt; Objekte sollten "deletedLater" niemals gelöscht werden ...

Was den Teil betrifft, in dem deleteLater () verwendet werden soll:

Kuba Ober antwortete:

  

Im Allgemeinen gibt es eine Reihe von Umständen, unter denen   deleteLater sollte verwendet werden. Wahrscheinlich sollten Sie einfach nicht verwenden   es ...

Hören Sie nicht darauf, es ist absolut falsch als die ganze Antwort. Was Sie tun sollten und was sollten Sie nicht besser entscheiden, nachdem Sie diesen Artikel gelesen haben. Es handelt sich zwar um Qt-Threads, aber der Artikel sagt auch etwas über asynchrone Programmierung aus (und, wie Emerald Weapon erwähnt, ist genau das, wofür deleteLater () erstellt wurde).

Außerdem haben intelligente Zeiger und QObject-Elternbesitz nichts damit zu tun, das Löschen mit deleteLater() zu planen. Diese beiden Techniken verwenden tatsächlich eine einfache Operation delete unter der Haube. Und wie der Artikel zeigt und wie die Emerald Weapon Antwort gezeigt hat: delete löst nicht die Probleme deleteLater() . Wenn Sie also ein Objekt löschen müssen, verwenden Sie delete , wenn Sie es für das Löschen einplanen müssen, verwenden Sie deleteLater() .

Übrigens, wenn Sie einen intelligenten Zeiger mit deleteLater() verwenden möchten, können Sie den Deleter angeben:

%Vor%

Und schließlich ist es ein NICHT ein Fehler, deleteLater() im Destruktor von QObject für nicht untergeordnete Objekte zu verwenden.

    
WindyFields 13.06.2017 13:41
quelle
2
___ qstnhdr ___ Wann sollte deleteLater verwendet werden? ___ antwort22389262 ___

Im Allgemeinen gibt es eine Reihe von Umständen, unter denen deleteLater verwendet werden sollte. Höchstwahrscheinlich sollten Sie es einfach nicht benutzen.

Es ist ein Fehler, es im Destruktor von QObject für nicht untergeordnete Objekte zu verwenden. Wie Sie festgestellt haben, kann QObjects möglicherweise zerstört werden, ohne dass eine Ereignisschleife vorhanden ist. Es gibt keine deleteLater -Aufrufe in Objektdestruktoren, zum Beispiel das qtbase Qt-Modul.

Man muss hier vorsichtig sein: zum Beispiel ruft ~QTcpServer() close() aufrufend d->socketEngine->deleteLater() auf, aber die Socket-Engine ist bereits ein Kind des Servers und wird trotzdem gelöscht durch ~QObject() .

Soweit ich weiß, sollte MyQTObject einen der folgenden Schritte ausführen:

  • mit einem intelligenten Zeiger wie QScopedPointer oder std::unique_ptr ,
  • haben die Objekte als reguläre (Nicht-Zeiger-) Mitglieder,
  • Verwenden Sie rohe Zeiger und lassen Sie die Objekte untergeordnete Objekte sein.
___ answer22382257 ___

Sie haben Recht, dass der Befehl %code% nur von einer Ereignisschleife ausgeführt wird.

Aus der Qt-Dokumentation für %code% :

  

Plant dieses Objekt zum Löschen.

     

Das Objekt wird gelöscht, wenn die Steuerung zum Ereignis zurückkehrt   Schleife. Wenn die Ereignisschleife bei dieser Funktion nicht ausgeführt wird   aufgerufen (z. B. deleteLater () wird zuvor für ein Objekt aufgerufen   QCoreApplication :: exec ()), wird das Objekt gelöscht sobald der   Ereignisschleife wird gestartet. Wenn deleteLater () nach der Hauptereignisschleife aufgerufen wird   wurde gestoppt, das Objekt wird nicht gelöscht.   Seit Qt 4.8, wenn deleteLater () für ein Objekt aufgerufen wird, das in a lebt   Thread ohne laufende Ereignisschleife, das Objekt wird zerstört, wenn der   Faden beendet.

     

Beachten Sie, dass Sie eine neue Ereignisschleife eingeben und verlassen (z. B. durch Öffnen eines Modals)   Dialog) wird das verzögerte Löschen nicht ausführen; um das Objekt zu sein   gelöscht, muss das Steuerelement von wo aus in die Ereignisschleife zurückkehren   deleteLater () wurde aufgerufen.

     

Hinweis: Es ist sicher, diese Funktion mehrmals aufzurufen. wenn das   Das erste verzögerte Löschungsereignis wird übermittelt, alle ausstehenden Ereignisse für   Objekt wird aus der Ereigniswarteschlange entfernt.

Wenn alle untergeordneten Elemente %code% gelöscht werden sollen, wenn %code% gelöscht wird, stellen Sie sicher, dass sie mit %code% als übergeordnetes Element erstellt werden.

    
___ qstntxt ___

Angenommen, ich habe das folgende Snippet, ist es sicher, deleteLater in qto's Destruktor für andere QT-Objekte, die es verwaltet, aufzurufen?

%Vor%

Weil ich einen ähnlichen Code wie diesen mit einem Leckdetektor analysiert habe und alle Objekte, für die deleteLater aufgerufen wurde, wurden nicht korrekt freigegeben, wenn ich den Aufruf nicht durch ein normales delete ersetzt habe. Wenn ich das richtig verstanden habe, registriert deleteLater nur ein Löschungsereignis in der QT-Nachrichtenwarteschlange. Kann dies das Problem sein, dass der Destruktor von qto am Ende des Bereichs von main aufgerufen wird, während die QT-Nachrichtenschleife bereits mit der Rückkehr von a.exec endet? Daher wird das Lösch-Ereignis niemals verarbeitet, tatsächlich nicht einmal in eine Nachrichten-Warteschlange geschoben, da es keine gibt?

    
___ tag123qt ___ Qt ist ein plattformübergreifendes Anwendungsentwicklungs-Framework, das häufig für die Entwicklung von Anwendungssoftware verwendet wird, die auf verschiedenen Software- und Hardwareplattformen ohne oder mit nur geringer Änderung der zugrundeliegenden Codebasis ausgeführt werden kann. Qt ist sowohl mit kommerziellen als auch mit Open-Source-Lizenzen verfügbar. ___ tag123messagequeue ___ "Nachrichtenwarteschlange" ist ein Entwurfsmuster oder eine Softwareentwicklungskomponente, die Disziplin oder API für die Kommunikation zwischen zwei oder mehr miteinander verbundenen Prozessen oder Systemen definiert. Die Nachrichtenwarteschlange erzwingt asynchrone Verarbeitung und lose Kopplung. Abhängig von der Implementierung können sie auch Liefer- und Bestellgarantien der Nachrichten bereitstellen. Message-Processing-Garantien sind ausdrücklich vom Design ausgeschlossen. ___ answer22378104 ___

Wie ich es verstehe, wird deleteLater am häufigsten verwendet, wenn Sie ein Objekt benötigen, das innerhalb des Anrufs zu einem Slot gelöscht werden soll. Wenn in diesem Fall delete verwendet wird und das Objekt bei der Rückkehr vom Slot referenziert wird, erfolgt ein Verweis auf nicht initialisierten Speicher.

Daher fordert deleteLater das zu löschende Objekt an, indem es eine Nachricht in die Ereignisschleife schreibt, die zu einem bestimmten Zeitpunkt verarbeitet wird, wenn es aus dem Slot zurückkehrt und gelöscht werden kann.

Ich erwarte, dass die Verwendung von deleteLater im Destruktor die Wahrscheinlichkeit erhöht, dass das Objekt den Gültigkeitsbereich verlässt, deleteLater für seine verwalteten Objekte aufruft, aber beendet wird, bevor die Ereignisschleife die Objekte löschen kann, wenn sie QApplication verlassen: : exec () beendet die Ereignisschleife.

    
___ answer44523289 ___

Die Frage ist alt, aber ich werde das für die zukünftige Generation lassen) Die Antwort, die als Antwort markiert wurde, ist korrekt, aber seltsam formuliert. Eigentlich enthält deine Frage eine richtige Antwort:

  

Meldungsschleife endet bereits mit der Rückkehr von a.exec? Und so kam es dass der   Löschungsereignis wird nie verarbeitet, in der Tat nicht einmal in eine   Nachrichtenwarteschlange, da keine vorhanden ist.

Genau das passiert gerade. Alles %code% tut gerade ein Löschungsereignis in die outer Ereignisschleife. Wenn das Ereignis verarbeitet wird, wird das Objekt gelöscht. Wenn jedoch keine utter-Ereignisschleife vorhanden ist und später keine Ereignisschleife im Ausführungsablauf auftritt, wird das Ereignis nie gesendet. Daher wird das Objekt nie gelöscht.

Wenn Sie %code% im Destruktor des Objekts aufrufen und ein Objekt auf den Stack setzen - %code% wird aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt. In Ihrem Beispiel wird "out of scope" ausgeführt, wenn geschweifte Klammern von %code% function gefunden werden. Zu diesem Zeitpunkt hat %code% (welches die Hauptereignisschleife von Qt App darstellt) bereits - & gt; keine Ereignisschleife mehr zurückgegeben - & gt; %code% wurde aufgerufen, aber es ist nicht möglich, ein Löschungsereignis zu veröffentlichen. - & gt; Objekte sollten "deletedLater" niemals gelöscht werden ...

Was den Teil betrifft, in dem deleteLater () verwendet werden soll:

Kuba Ober antwortete:

  

Im Allgemeinen gibt es eine Reihe von Umständen, unter denen   deleteLater sollte verwendet werden. Wahrscheinlich sollten Sie einfach nicht verwenden   es ...

Hören Sie nicht darauf, es ist absolut falsch als die ganze Antwort. Was Sie tun sollten und was sollten Sie nicht besser entscheiden, nachdem Sie diesen Artikel gelesen haben. Es handelt sich zwar um Qt-Threads, aber der Artikel sagt auch etwas über asynchrone Programmierung aus (und, wie Emerald Weapon erwähnt, ist genau das, wofür deleteLater () erstellt wurde).

Außerdem haben intelligente Zeiger und QObject-Elternbesitz nichts damit zu tun, das Löschen mit %code% zu planen. Diese beiden Techniken verwenden tatsächlich eine einfache Operation %code% unter der Haube. Und wie der Artikel zeigt und wie die Emerald Weapon Antwort gezeigt hat: delete löst nicht die Probleme %code% . Wenn Sie also ein Objekt löschen müssen, verwenden Sie %code% , wenn Sie es für das Löschen einplanen müssen, verwenden Sie %code% .

Übrigens, wenn Sie einen intelligenten Zeiger mit %code% verwenden möchten, können Sie den Deleter angeben:

%Vor%

Und schließlich ist es ein NICHT ein Fehler, %code% im Destruktor von %code% für nicht untergeordnete Objekte zu verwenden.

    
___
Kuba Ober 13.03.2014 19:44
quelle
1

Sie haben Recht, dass der Befehl deleteLater() nur von einer Ereignisschleife ausgeführt wird.

Aus der Qt-Dokumentation für QObject :

  

Plant dieses Objekt zum Löschen.

     

Das Objekt wird gelöscht, wenn die Steuerung zum Ereignis zurückkehrt   Schleife. Wenn die Ereignisschleife bei dieser Funktion nicht ausgeführt wird   aufgerufen (z. B. deleteLater () wird zuvor für ein Objekt aufgerufen   QCoreApplication :: exec ()), wird das Objekt gelöscht sobald der   Ereignisschleife wird gestartet. Wenn deleteLater () nach der Hauptereignisschleife aufgerufen wird   wurde gestoppt, das Objekt wird nicht gelöscht.   Seit Qt 4.8, wenn deleteLater () für ein Objekt aufgerufen wird, das in a lebt   Thread ohne laufende Ereignisschleife, das Objekt wird zerstört, wenn der   Faden beendet.

     

Beachten Sie, dass Sie eine neue Ereignisschleife eingeben und verlassen (z. B. durch Öffnen eines Modals)   Dialog) wird das verzögerte Löschen nicht ausführen; um das Objekt zu sein   gelöscht, muss das Steuerelement von wo aus in die Ereignisschleife zurückkehren   deleteLater () wurde aufgerufen.

     

Hinweis: Es ist sicher, diese Funktion mehrmals aufzurufen. wenn das   Das erste verzögerte Löschungsereignis wird übermittelt, alle ausstehenden Ereignisse für   Objekt wird aus der Ereigniswarteschlange entfernt.

Wenn alle untergeordneten Elemente QObjects gelöscht werden sollen, wenn qto gelöscht wird, stellen Sie sicher, dass sie mit qto als übergeordnetes Element erstellt werden.

    
RobbieE 13.03.2014 14:47
quelle

Tags und Links