C++ Qt4 - Label anzeigen ohne exec()

F

Flup

Gast
Hallo zusammen,

ich versuche mich gerade etwas in Qt einzuarbeiten und will dazu zunächst mal einige meiner Konsolenanwendungen auf GUI umrüsten. Dazu wäre es zunächst notwendig, dass ich in einem Fester einen Text anzeigen kann, der sich im Programmablauf ändern kann.

Dazu sieht der relevante Code derzeit so aus:
Code:
int main(int argc, char **argv){

    //[..]
	
    QApplication a( argc, argv );

    QLabel hello( "Hello world!");
    hello.resize( 100, 30 );

    hello.show();
    //a.exec();

    while(1) {
        msgObj = s.receiveFrom(2048);
	if (msgObj.msglen > 0) {
        // Hier soll das Label geändert werden
            s.sendTo(msgObj);
        }	
    }
    //[..]

Das Problem daran: Ruf ich a.exec() auf, erscheint mein Fenster, wartet auf User Interaktion (was jetzt bei einem QLabel eh nicht möglich ist) und stoppt dadurch den Programmfluss. Bleibt der Befehl auskommentiert, läuft das Programm, das Fenster zeigt sich aber nicht.

Ich habe auf die Schnelle versucht, das Fenster in einem zweiten Thread zu starten, aber erstens meckert da noch der Compiler irgendwas von wegen C+0x Inkompatibilität durch den thread-include und zweitens will ich den Text oft ändern können, da erzeugt das ganze unnötigen overhead.

Lange Rede, kurzer Sinn: Gibt es einen weg, den exec() Aufruf zu vermeiden und das Fenster trotzdem anzuzeigen? Wenn nicht, wie geht man hier am besten vor?

Vielen Dank
 
Zuletzt bearbeitet von einem Moderator:
Was ändert den Text in deinem CLI Programm? Was macht das Konsolenprogramm überhaupt?

PS: es gibt auch QTimer wenn notwendig.
 
Ich hab das oben nochmal ergänzt, das ganze gehört zu einem UDP Server, oben gibt er der Einfachheit halber nur das zurück was reinkommt.

Inwiefern kann mir denn der Timer helfen?
 
Zuletzt bearbeitet von einem Moderator:
Ja das hab ich mittlerweile auch gesehen, nachdem das Programm aber gut funktioniert und es mir darum geht, ein paar Zeilen Text in einem GUI darzustellen würde ich gerne vermeiden den Netzwerk-Code zu ändern.

Vielleicht ist Qt für meine Zwecke auch einfach das falsche Werkzeug. Was bietet sich denn an, um unter Raspbian einfache Fenster zu erzeugen?
 
Qt passt schon. Du könntest natürlich auch andere Frameworks wie z.B. Gtk verwenden, aber das Problem ist im Prinzip überall das selbe: der Thread in dem du die GUI startest, "blockiert" (arbeitet in einer exec-loop) bis du die GUI wieder beendest.

Anstatt also das Framework zu wechseln, solltest du einen zweiten Thread starten - für dein "eigentliches" Programm. Aus diesem Thread kannst du in Qt auch per Signals/Slots das GUI verändern. Sobald du Threads verwendest musst du zwar auf die typischen Threading-Stolperfallen achten (Zugriff auf gemeinsame Variablen, Locks/Mutexes, Deadlocks, ...), aber die sind meiner Erfahrung nach in Qt einfacher zu handeln als in Gtk. Wenn ich mich nicht irre sind Signals/Slot nämlich eh Threadsafe.

Falls du C++11 verwendest, sind Threads und entsprechende Locking-Mechanismen direkt dabei. Alternativ bietet auch Qt entsprechende Klassen an (QThread).

Liebe Grüße,
Christian
 
Zuletzt bearbeitet:
Zurück
Oben