Destruktoren in Qt4
Ich bin sehr verwirrt über die Verwendung von Destruktoren in Qt4 und hoffe, Euch kann mir helfen.
Wenn ich eine Methode wie diese (mit "Des" ist eine Klasse):
void Widget::create() {
Des *test = new Des;
test->show();
}
wie kann ich sicherstellen, dass dieses widget wird gelöscht, nachdem es geschlossen wurde?
Und in der Klasse "Des" habe ich dieses:
Des::Des()
{
QPushButton *push = new QPushButton("neu");
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(push);
setLayout(layout);
}
wo und wie muss ich die löschen *drücken und *layout? was sollte im Destruktor Des::~Des() ?
InformationsquelleAutor Berschi | 2009-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere option, mit
deleteLater()
oder Eltern, ist die Verwendung der delete-on-close Funktionen für die widgets. In diesem Fall Qt löscht das widget, wenn es fertig ist, angezeigt wird.Ich möchte es mit dem Objekt-Baum, der Qt hält, so dass ich setzen, löschen, auf-schließen für die Fenster, und alle widgets im Fenster haben richtige Eltern angegeben, so werden Sie alle gelöscht.
es ist möglich, dass entweder Qt oder dein OS ist dabei einige Speicher-Optimierung. Wenn die fünfte widget, das Sie erwähnen in Ihrem Kommentar führt nicht zu mehr Speicher verwendet werden, ich würde keine sorgen zu viel. Eine weitere option, wenn Sie betroffen sind, finden Sie ein tool wie valgrind und führen Sie Ihr Programm durch.
InformationsquelleAutor Caleb Huitt - cjhuitt
Qt verwendet, wie Sie es nennen Objekt Bäume und es ist ein bisschen anders als die typischen RAII Ansatz.
Den
QObject
Klasse Konstruktor nimmt einen Zeiger auf eine übergeordneteQObject
. Wenn diese übergeordnetenQObject
ist zerstört, seine Kinder auch zerstört werden. Dies ist eine ziemlich weit verbreitete Muster in der Qt-Klassen und Sie werden bemerken, eine Menge von Konstruktoren akzeptieren*parent
parameter.Wenn Sie einen Blick auf einige der Qt Beispielprogramme werden Sie feststellen, dass Sie tatsächlich bauen die meisten Qt-Objekte auf dem heap und profitieren Sie von diesem Objekt Baum zu behandeln Zerstörung. Ich persönlich fand diese Strategie sinnvoll, wie es auch auf GUI-Objekte haben kann, eigenartiges Leben.
Qt bietet keine weiteren Garantien über standard-C++, wenn Sie nicht mit
QObject
oder eine Unterklasse vonQObject
(wieQWidget
).In Ihrem speziellen Beispiel gibt es keine Garantie, dass alles gelöscht wird.
Werden Sie wollen so etwas für
Des
(vorausgesetztDes
ist eine Unterklasse vonQWidget
):Und Sie verwenden würden, Klasse
Des
etwa so:Wenn das widget nicht mit einem sauberen Leben und keine Eltern, mit denen Sie assoziieren es mit die beste option ist die Verwendung der delete-on-close Funktionalität, cjhuitt erwähnt in einer anderen Antwort.
nur zur Klärung, wenn wir den "Taster" als member-variable ist, dann müssen wir löschen Sie die push-Taste manuell in das widget Destruktor oder es wird gelöscht, wenn das übergeordnete gelöscht wird..
Wenn Sie eine
QPushButton *
als eine member-variable, und geben Sie ihm einen geeigneten Elternteil (mit dem Konstruktor oder mitsetParent()
), es wird gelöscht, wenn das übergeordnete Objekt gelöscht. Sie könnte auch mit einem einfachenQPushButton
(und lassen Sie die standard-C++ - Zerstörung-Regeln treten in), aber Sie werden wahrscheinlich feststellen, dass für viele der Qt-GUI-Sachen, die Sie will ein Elternteil sowieso.Danke für die Aufklärung
InformationsquelleAutor richardwb
Richardwb s Antwort ist gut - aber der andere Ansatz ist die Verwendung der deleteLater Schlitz, etwa so:
Offensichtlich die geschlossene () - signal ersetzt werden kann, mit welchem signal Sie wollen.
OK, gut, es war gedacht als ein Allgemeines Konzept, sondern als ein konkretes Beispiel. Vielleicht kann man hinzufügen, dass ein signal wird ausgegeben, wenn Sie Ihr Objekt beendet es die Arbeit? Es ist eine sehr nützliche Muster sowieso, es können Sie etwas erschaffen und es zu vergessen, vorausgesetzt, Sie speichern keine Verweise auf Sie, und das tut es, schließlich zu beenden.
InformationsquelleAutor Thomi
Dieses tutorial schlägt Sie nicht explizit löschen von widgets, die Hinzugefügt wurden, zu übergeordneten widgets. Man sagt auch, es tut nicht weh zu tun, löschen Sie entweder.
(Habe ich nicht getestet, aber ich denke mal, so lange, wie Sie Sie ausdrücklich löschen, bevor das übergeordnete widget gelöscht wird, sollte dies OK sein.)
InformationsquelleAutor Steve Folly
In den meisten Fällen sollten Sie widgets erstellen, die auf dem stack:
Diese Weise bekommen Sie gelöscht, wenn Sie sich außerhalb des Bereichs. Wenn Sie wirklich wollen, erstellen Sie auf dem heap ist, dann ist es Ihre Verantwortung, rufen Sie löschen auf Sie, wenn Sie nicht mehr benötigt werden.
dribeas, ich denke, dass, wenn ein QObject ist, zerstört es automatisch unregistrierten gegenüber den Eltern.
Ich benutze stack Allokation mit QObjects die ganze Zeit und es funktioniert gut. Vielen Dank für die uninformierten downmod.
Ja, der Punkt ist, dass die Eltern müssen nicht gelöscht werden, wenn das Kind vorhanden ist, oder Sie müssen sicherstellen, dass die Eltern nicht halten Eigentum.
InformationsquelleAutor static_rtti