QLineEdit Anzeige bei Aufruf über einen Thread bleibt leer.

Alles rund um die Programmierung mit Qt
Antworten
dieter_
Beiträge: 18
Registriert: 11. November 2012 12:16

QLineEdit Anzeige bei Aufruf über einen Thread bleibt leer.

Beitrag 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
helmut.jakoby
Beiträge: 19
Registriert: 17. Januar 2012 15:26
Kontaktdaten:

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

Beitrag 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.
dieter_
Beiträge: 18
Registriert: 11. November 2012 12:16

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

Beitrag 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
Antworten