Seite 1 von 1

QLineEdit Anzeige bei Aufruf über einen Thread bleibt leer.

Verfasst: 3. Januar 2024 18:54
von dieter_
Mein Programm hat in der mainForm.ui ein QLineEdit Feld.
In der mainWindow.cpp wird das QLineEdit Feld mit einer Funktion mit Daten gefüllt.

Diese Funktion wird allerdings über einen Thread aufgerufen.
Das Problem ist, das das QLineEdit Feld während der Abarbeitung im Thread
mit diesem Befehl

Code: Alles auswählen

ldt_file ->setText(QString::number(file_zaehler));
wiederholt aufgefordert wird das QLineEdit Feld zu füllen.

Die Anzeige im QLineEdit Feld bleibt leer.

Wie kann ich erreichen, dass die Anzeige im QlineEdit Feld sichtbar wird.
Dem QLineEdit Feld muss irgenwie der Focus zugeteilt werden.

Grü0e aus Südbaden

Re: QLineEdit Anzeige bei Aufruf über einen Thread bleibt leer.

Verfasst: 5. Januar 2024 08:09
von helmut.jakoby
Du musst dem Haupt-Thread Zeit zum anzeigen geben.
Ich habe dafür das "Signal-Slot-Konzept" genutzt.
Man erstellt ein Signal (im Thread), welches man mit einer Methode (welche den Wert anzeigt) im Haupt-Thread verbindet.

Code: Alles auswählen

    connect( MyCalculateThread, SIGNAL( signal_calculated( int ) ),
              this, SLOT( showValue( int ) ) );
Wenn in einem Thread etwas ermittelt wird, welches im Haupt-Thread angezeigt werden soll, wird ein Signal initiiert wie z.B.:

Code: Alles auswählen

emit this->signal_calculated( wert);
welches vom Haupt-Thread "gefangen" wird und die Anzeige vornehmen kann.

Das Funktioniert bei mir mit Threads, die ich von QThread abgeleitet habe.

Re: QLineEdit Anzeige bei Aufruf über einen Thread bleibt leer.

Verfasst: 7. Januar 2024 15:05
von dieter_
Danke für Deine Antwort.

Ich konnte das Problem auch so lösen:
In einem Buch über Qt4 aus dem Jahr 2007 habe ich bei dem Kapitel "Ereignisverarbeiten optimieren" dies gefunden:
Der Verfasser Jürgen Wolf schreibt, dass man nicht zwangsläufig bei Zeit beanspruchenden Arbeiten auf Threads zurückgreifen muss.
Bei der Routine, die viel Zeit in Anspruch nimmt, fügte Wolf diesen Befehl in die Routine ein:

Code: Alles auswählen

qApp->progressEvents()
Ich habe diese Zeile in meine zeitkritische Routine eingefügt und die Routine wird nicht mehr über einen Thread gestartet.
Das Programm arbeitet nun, trotz nahezu 30-minütiger Dauer, ohne die Fehlermeldung.
Grüße aus Südbaden