Qt Fragen

Verschiedenes zu Qt
Antworten
fr33g
Beiträge: 22
Registriert: 14. Februar 2010 16:26

Qt Fragen

Beitrag von fr33g »

Hey Leute, bin neu hier und ich habe gleich mal mal eine paar Fragen.
Die erste zu QDialog.
Wenn ich einen Dialog habe und ihn durch eine singal slot verbindung mit clicked und exec verbinde, startet er ja durch einen Klick auf den von mir festgelegten Button.
So in meinem Buch steht nun dass wenn man im Dialog zum Beispiel Ok klickt, wird der Dialog nicht beendet bzw zerstört sondern nur versteckt.
Was bedeutet dies? und vor allem wann wird er denn beendet.
Dachte nämlich eg klicke ich dann auf Ok gibt exec als Rückgabewert acceptet zurück und ich komm wieder ins Hauptfenster. Drücke ich den Button nun erneut, startet der Dialog erneut, aber er wird ja anscheinend immer nur versteckt...?

Und dann hätte ich noch eine Allgemeine Verständnisfrage:

Code: Alles auswählen

 
int main( int argc, char* argv[] ) 
{ 
QApplication app( argc, argv ); 
myWindow* window = new myWindow; 
window->show(); 
return app.exec(); 
} 
Mit show wird ja einfach nur das Window angezeigt, die eigentliche anwedung startet ja erst in der letzten zeile mit exec.
Verstehe ich das Richtig dass dann einfach die Application gestartet wird und quasi dann alles übernimmt, also Klicks und so und dies an die richtigen Klassen weiterleitet, die dann die Aufgaben durchführen.
Und das Programm endet dann eben mit quit().

Und dann hätte ich noch eine Frage, und zwar

Code: Alles auswählen

dialog->setAttribute( Qt::WA_QuitOnClose )   
Verstehe das nicht wirklich was das bewirken soll.
Hoffe ihr könnt mir helfen, danke schonmal=)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Na dann mal willkommen 8)

Ich versuch mal Deine Fragen vorsichtig zu beantworten.
Was bedeutet dies? und vor allem wann wird er denn beendet.
Was verstehst du unter beenden ???

QT Gui Objecte interagieren mit dem BS. Das heisst, dein QDialog, das auch nen QWidegt ist, und damit auch nen QPaintdevice wird im hintergrund sicher irgendwo nen handle auf nen BS spezifisches fensterObject haben.
Wann das zeugs "freigegeben" wird, iss sicherlich ned so einfach zu bestimmen.
Genau so kann es eigene Klassen im hintergrund weiter behandeln ...

Dieses Caching iss normal. Wichtig iss das du es nicht beachten solltest, und erst recht ned zu benutzen. Wenn du ressourcen frei gibst .. sind sie fuer dich weg ! Was die QT macht, wurscht !
Was bedeutet dies?
Fuer dich eben eigentlich nix !

rufst du einen QDialog modal mit exec() auf.... und due beendest den intern durch ein accept / reject, dann kehrt in dem moment dein Exec zurueck.
Dein QDialog selber iss noch gueltig, du koenntest den nochmal mit exec aufreufen ... erst wenn du den QDialog leoschst, also bei dynamischer erzeugung ueber delete bzw statisch wenn deine variable ausm scope rennt, dann kommst nimmer drauf. Und was der im hintergrund tut .. oder er die GUI objecte wirklich freigibt, oder nur auf invisible setzt ... iss egal.
Rauskriegen kann man das, in dem man mal mit dem windows spy z.b. schaut, was da alles fuer systemnachrichten fliessen. aber verwenden sollte man die erkenntnisse keinenfals. nur vielleicht im hinterkopf behalten.
Mit show wird ja einfach nur das Window angezeigt,
nein, es wird auf sichtbar gesetzt ... zum anzeigen brauchst du meist eine lauffaehige eventloop. ... es wird sicher an der stelle nix angezeigt.
Stell dir vor, du machst nur das show, laesst einfach das exec nie laufen, oder verzeoegerst es ... das heisst, dein fehster wuerde entweder unvollstaendig oder gar nicht gezeichnet(paint event) und keiner deiner GUI Objecte (buttons z.b.) koennte ne usereingabe machen.

Das show wird dir eigentlich nur nachrichten generieren, die dein fenster sichtbar machen. Aber biss in die eventloop eintrittst, werden die nur in der schleifen vorhanden sein, aber nie irgendwas bewirken. erst wenn die eventloop startest (exec) werden die befehle darin abgearbeitet und and das BS durchgereicht, und auch erst dann kommst du in die paintereignisse der subfenster, so dass ueberhaupt was benutzerdefiniertes zeichnen koennetest.
also Klicks und so und dies an die richtigen Klassen weiterleitet
Genau das macht die eventqueue. Wobei du in dem fall eigentlich 2 hasst. Die von der winapi und die von QT, wobei die sicher gut verzahnt miteinander sind.
Und das Programm endet dann eben mit quit().
wenn deine QApplication ein Quit bekommt (es gibt mehrere events, die wenn sie fertig sind ein quit an die App schicken koennen) stigst du aus der eventquee aus, sprich deine exec() funktion kommt zurueck. Alles andere spielt sich eigentlich aus sicht der main() im aufruf von exec() ab
dialog->setAttribute( Qt::WA_QuitOnClose )
Damit setzt du eine eigenschaft des Dialogs. Das heisst, nix anderes, als wenn dieses fesnter geschlossen wird (also die dazugoehirigen Gui elemente auf Hide gesetzt werden, oder auch gleich freigegeben) wird danach noch der Application das Quit ereigniss geschickt. damit fliegt die Application aus der Schleife, quasi dein exec beendet sich, und in normalen qt programmen iss dann auch schluss, das heisst dein main lauft aus, alle objecte fleiegen ausm scope, die main beendet sich, die globale aufraeumroutine wird aufgerufen um evtuelle globale scahen noch zu bereinigen und dein programm wird dann beendet, schickt paar signale ans BS, worauf das BS wiederum den prozess aufraeumt ...

Damit ersparst du dir eigentlich ne seperate verbindung. Gibt nochn anderen weg, du kannst die app sich auch beenden wenn es kein aktives fenster mehr gibt. dann kann die app sich selber auch das quit schicken ...

machst du das ned, und deine fenster wuerden schliessen, wuerde deine loop sich nie beenden, und dein exec ned auslaufen, deine app sich nie beenden, du muesstest die killen.

alternativ zu den komfortablen dingen , kannst auch das close event von dem fenster mit dem application quit verbinden, das hat den selben effekt.

Ciao ...
fr33g
Beiträge: 22
Registriert: 14. Februar 2010 16:26

Beitrag von fr33g »

Hey erst mal Danke für die ausführliche Antwort.
War mir sehr hilfreich :)

Das einzigste was ich noch net so ganz verstehe is das mit dem QuitOnClose.
Also in meinem Buch steht als Kommentar zu der Zeile
//Programm nicht beenden wenn Dialog zerstört wird

Ich verstehe das net, du meintest doch dass dadurch das Programm beendet werden kann oder nicht.
Sorry falls ichs grad komplett falsch verstehe, vielleicht könntest mir es nochmal erklären=)
Weil den Rest habe ich jetzt alles verstanden;-)

Danke schonmal
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ok, nochmal in der Doku nachgeschaut :-)
Ich verstehe das net, du meintest doch dass dadurch das Programm beendet werden kann oder nicht.
Nee hab da was mit dem quitOnLastWindowClosed verwechselt.

Qt::WA_DeleteOnClose

Macht folgendes:
Schliesst du das Fenster(QWidget) , wird nen Flag gesetzt, das intern die QT benachrichtigt, das dieses QWidget zersteoert werden kann.
Also wurde dein Widget dynamisch erzeugt, stellt er beim close in dem widget irgend nen event in die queue, das er (in dem fall wahrscheinlich sein parent) das fenster auch loescht ... also delete auf das widget aufruft.

Machst du es nicht ... wird das Fenster erst geloescht, wenn das parent auch geloescht wird.

Bei controls aufn fenster isses eh wurscht, die werden ned seperat geclosed sondern immer mitm parent.

Macht also eher bei "freistehenden" widgets, ala Mainwindow und QDialog etc Sinn ...
f the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.

The QApplication::lastWindowClosed() signal is emitted when the last visible primary window (i.e. window with no parent) with the Qt::WA_QuitOnClose attribute set is closed. By default this attribute is set for all widgets except transient windows such as splash screens, tool windows, and popup menus.
Also Qt::WA_DeleteOnClose hat nix mit dem eigentlichen verhalten zu tun, sondern nur was mit dem ressourcenhandling.

Um eine Application beenden zu koennen, muss irgendwer dein QApplication::quit aufrufen, aus der eventqueue heraus klar.
It's common to connect the QApplication::lastWindowClosed() signal to quit()
oder du setzt QApplication::quitOnLastWindowClosed auf true, das macht genau das selbe ...

Ciao ...
fr33g
Beiträge: 22
Registriert: 14. Februar 2010 16:26

Beitrag von fr33g »

Hehe sorry aber ich meinte doch WA_QuitOnClose und nicht DeleteOnClose;-)

Sorry will dich jetzt net verärgern, aber könntest du mir vielleicht auch WA_QuitOnClose erklären :oops:
Weil die Erklärung in der Doc von Qt raff ich net wirklich=(

Schonmal danke für deine Mühe=)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

WA_QuitOnClose und quitOnLastWindowClosed und spielen zusammen.
QApplication::LastwindowClosed bereucksichtigt nur die Fenster, die kein parent haben (also mainfenster sind) und WA_QuitOnClose gesetzt haben.

WA_QuitOnClose ist standardmaessig gesetzt. Nimmst das raus, nimmst qausi das fenster aus dem mechanismus raus ...
Lauft nen anderes Mainfenster das baer mit WA_QuitOnClose, und du beendest das, wird dein App dann auch beendet, egal was mit dem anderen fesnter war.

Uebrigens, steht alles in der Doku !
http://doc.trolltech.com/4.6/qt.html#Wi ... ibute-enum

Ciao ...
Antworten