qt - QWidget



  • Hallo,

    ich bin Anfänger mit qt. Nun habe ich eine kleine GUI geschrieben. Soweit ich das verstehe wird das ganz über eine abgeleitet Klasse von QMainWindow verwendet. Nun habe ich einen Konstruktor in dem alle Dinge wie zb. "connect()" etz reinkommen. Diese werden auch immer ausgeführt. Nur wie funktioniert das ganze im Hintergrund. Der Konstruktor läuft ja wohl kaum in einer Schleife.

    Soweit ich das verstehe, wird im Konstruktor und nicht in der main das ganze Programm geschrieben?

    Jetzt zu meiner Frage, wie kriege ich meine Programmabschnitte ebenfalls dazu das diese abgefragt und bei Bedarf ausgeführt werden. Im konkreten Fall geht es darum, dass wenn am Port Daten anliegen ein Programmabschnitt ausgeführt wird.

    Danke Gruß



  • Du hast keine Ahnung von C++, richtig?



  • Der Konstruktor Deiner Klasse wird ausgeführt sobald diese Klasse instantiiert wird, d.h. sobald Du tatsächlich ein Objekt der Klasse erzeugst.

    Werden mehrere Objekte der selben Klasse erzeugt, so wird der Konstruktor für jedes dieser Objekte erneut ausgeführt. Das alles sind C++ Grundlagen und hat mit Qt erstmals rein gar nichts zu tun...

    BTW: Das Erzeugen der Objekte kann (muss aber nicht!) in Deiner** main() **Funktion passieren.



  • Das Objekt wird in der main erzeugt das verstehe ich. Mir ist das eben nicht klar wieso es eben hier anders ist (jedenfalls für mich). Ich habe im Konstruktor die Funktion connect() diese wird aber immer ausgeführt wenn ich eine Taste auf der GUI drücke? Wie kommt das?



  • Als Beispiel:

    Taschenrechner::Taschenrechner(QMainWindow *parent) : QMainWindow(parent){	
    	setupUi(this);
    	InputA -> setText("0");
    	InputB -> setText("0");
    	InputA_2 -> setText("0");
    	InputB_2 -> setText("0");
    
    	connect(Calculate, SIGNAL (clicked()), this, SLOT(addAB()));
    	connect(actionQuit,SIGNAL (triggered()), this, SLOT(slotClose()));
    	connect(actionAdd, SIGNAL(triggered()), this, SLOT(showAdd()));
    	connect(actionSub, SIGNAL(triggered()), this, SLOT(showSub()));
    }
    

    Das ganze Programm ist hier im Konstruktor und der läuft "scheinbar" in einer Schleife? Oder wie funktioniert das?



  • Die Main:

    int main( int argc, char* argv[])
    {
            QApplication a(argc, argv);
            Taschenrechner w;
            w.show();
            return a.exec();
    }
    

    Keine Schleife nix.



  • TryHard123 schrieb:

    Als Beispiel:

    Taschenrechner::Taschenrechner(QMainWindow *parent) : QMainWindow(parent){	
    	setupUi(this);
    	InputA -> setText("0");
    	InputB -> setText("0");
    	InputA_2 -> setText("0");
    	InputB_2 -> setText("0");
     
    	connect(Calculate, SIGNAL (clicked()), this, SLOT(addAB()));
    	connect(actionQuit,SIGNAL (triggered()), this, SLOT(slotClose()));
    	connect(actionAdd, SIGNAL(triggered()), this, SLOT(showAdd()));
    	connect(actionSub, SIGNAL(triggered()), this, SLOT(showSub()));
    }
    

    Das ganze Programm ist hier im Konstruktor und der läuft "scheinbar" in einer Schleife? Oder wie funktioniert das?

    Nein!

    Der Konstruktor von "Taschenrechner" wird genau einmal ausgeführt (pro erzeugtem "Taschenrechner"-Objekt). Und zwar genau dann wenn das "Taschenrechner"-Objekt erzeugt wird.

    Irgendwo in der** main() **Funktion findest Du vermutlich so etwas wie:

    Taschenrechner *taschenrechner = new Taschenrechner();
    

    In dieser Zeile wird ein neues "Taschenrechner"-Objekt angelegt, d.h. an dieser Stelle wird der Konstruktor ausgeführt. Aber nur einmal 😉

    TryHard80 schrieb:

    Die Main:

    int main( int argc, char* argv[])
    {
            QApplication a(argc, argv);
            Taschenrechner w;
            w.show();
            return a.exec();
    }
    

    Keine Schleife nix.

    Richtig. Wieso auch? 😕

    (BTW: Qt arbeitet Ereignis-basiert und** QApplication::exec() **startet die Ereignis-Verarbeitung)



  • TryHard80 schrieb:

    Keine Schleife nix.

    Naja, wenn du so willst, doch. Das a.exec führt die Event Loop des Programms aus, also eine Schleife. Das ist im Endeffekt tatsächlich auch eine Endlosschleife, die Nachrichten von Windows abholt (z.B. Taste wurde gedrückt oder Maus bewegt) und diese Nachrichten dispatcht, also an Objekte weiterreicht, bei denen du irgendwelche Signale verbunden hast.



  • Danke,
    und wo kommt jetzt mein Programm rein? Also ich will ein Port abfragen und ob Daten an ihm anliegen.

    Danke Gruß



  • Tryhard123 schrieb:

    Danke,
    und wo kommt jetzt mein Programm rein? Also ich will ein Port abfragen und ob Daten an ihm anliegen.

    Danke Gruß

    Das kommt doch ganz darauf an! Letztendlich ist ja alles "Dein Programm". Die entscheidende Frage ist daher eher, wo man welche Funktionalität geschickterweise implementieren sollte.

    Da Qt, wie schon gesagt, komplett Ereignis-basiert ist, solltest Du Dir zuerst mal überlegen, wann etwas bestimmtes gesehen soll 😉

    Um zum Beispiel auf das Klicken eines** QPushButton 's zu reagieren, würdest Du einen neuen Slot anlegen und diesen im Konstruktor mit dem clicked() **Signal des Buttons verbinden.

    Dann würde dieser Slot fortan immer dann ausgeführt, sobald der Benutzer auf den Button klickt. In diesen Slot könntest Du folglich Befehle rein schreiben, die ausgeführt werden sollen, sobald der Button geklickt wurde.

    Ganz Allgemein, wirst Du mit Qt nicht weit kommen, solange Du Signale und Slots nicht verstanden und verinnerlicht hast! Siehe auch hier.

    BTW: Wenn Du Deine eigene Klasse von** QMainWindow abgeleitet hast, dann gibt es auch diverse Event-Handler Funktionen, die Du re-implementieren könntest, z.B. showEven() oder closeEvent() **.



  • Alles klar, ich werde es mir durchlesen und mich nochmal melden wenn ich nicht weiterkommen.
    Danke nochmals.!


Anmelden zum Antworten