QMessageBox Modalitaet und Speicherverwaltung
Verfasst: 15. April 2008 17:26
Hi,
ich habe eine Frage zu Modalitaet und Speicherverhalten von QMessageBox.
(QT Version 4.x)
QMessageBox erzeugt mir eine modale Nachrichtenbox. Modal heisst, dass ich
sie erst wegklicken muss, bevor ich mit dem Widget weiterarbeiten kann,
zu dem sie modal ist.
Unterschiede zwischen exec() und show() bei QMessageBox:
exec() wuerde ja fuer die MessageBox eine eigene Event-Loop anlegen.
Sprich das Programm bleibt solange an der Stelle stehen, bis die
Nachrichtenbox weggedrueckt wird.
bei show() laeuft die Anwendung im Hintergrund weiter.
ch kann
nur eben das Widget, zu dem die Box modal ist nicht anwaehlen)
Ist das soweit korrekt?
Das Widget zu dem eine QMessageBox modal sein soll uebergibt man ihr als
parent im Konstruktor.
Nur wo bleibst da jetzt der Pltatz fuer die Speicherverwaltung?
Normalerweise wird ja ein Widget geloescht, wenn....
....es auf dem Heap liegt und sein parent geloescht wird
....es auf dem Heap liegt und ich es mit delete loesche (dann darf es
kein Parent haben!)
....es auf dem Heap liegt, ein Parent hat und ich explizit deleteLater()
aufrufe
....es auf dem Stack liegt und die Funktion, in der es angelegt wurde
verlassen wird (dann darf es auch kein Parent haben - muss also root sein).
Wann wird jetzt aber eine MessageBox geloescht? Das Parent wird ja hier
etwas zweckentfremdet. Oder gelten hier weiterhin die oben genannten Regeln?
Wie kann ich dann eine MessageBox erzeugen, die Modal zur gesamten
Anwendung ist (also eigentlich Parent = 0), und trotzdem ein Parent
im oben genannten Sinn (Speicherverwaltung) hat?
Und wo liegen eigentlich die MessageBoxen von den statischen Memberfunktionen:
z.B.: QMessageBox::critical(....) ?
Auf dem Stack oder auf dem Heap?
Ich wuerde mich sehr freuen, wenn mir jemand helfen kann.
Falls ich mich nicht verstaendlich genug ausgedrueckt habe, bitte kurzer Hinweis.
Col
ich habe eine Frage zu Modalitaet und Speicherverhalten von QMessageBox.
(QT Version 4.x)
QMessageBox erzeugt mir eine modale Nachrichtenbox. Modal heisst, dass ich
sie erst wegklicken muss, bevor ich mit dem Widget weiterarbeiten kann,
zu dem sie modal ist.
Unterschiede zwischen exec() und show() bei QMessageBox:
exec() wuerde ja fuer die MessageBox eine eigene Event-Loop anlegen.
Sprich das Programm bleibt solange an der Stelle stehen, bis die
Nachrichtenbox weggedrueckt wird.
bei show() laeuft die Anwendung im Hintergrund weiter.
nur eben das Widget, zu dem die Box modal ist nicht anwaehlen)
Ist das soweit korrekt?
Das Widget zu dem eine QMessageBox modal sein soll uebergibt man ihr als
parent im Konstruktor.
Nur wo bleibst da jetzt der Pltatz fuer die Speicherverwaltung?
Normalerweise wird ja ein Widget geloescht, wenn....
....es auf dem Heap liegt und sein parent geloescht wird
....es auf dem Heap liegt und ich es mit delete loesche (dann darf es
kein Parent haben!)
....es auf dem Heap liegt, ein Parent hat und ich explizit deleteLater()
aufrufe
....es auf dem Stack liegt und die Funktion, in der es angelegt wurde
verlassen wird (dann darf es auch kein Parent haben - muss also root sein).
Wann wird jetzt aber eine MessageBox geloescht? Das Parent wird ja hier
etwas zweckentfremdet. Oder gelten hier weiterhin die oben genannten Regeln?
Wie kann ich dann eine MessageBox erzeugen, die Modal zur gesamten
Anwendung ist (also eigentlich Parent = 0), und trotzdem ein Parent
im oben genannten Sinn (Speicherverwaltung) hat?
Und wo liegen eigentlich die MessageBoxen von den statischen Memberfunktionen:
z.B.: QMessageBox::critical(....) ?
Auf dem Stack oder auf dem Heap?
Ich wuerde mich sehr freuen, wenn mir jemand helfen kann.
Falls ich mich nicht verstaendlich genug ausgedrueckt habe, bitte kurzer Hinweis.
Col