Hallo Forum!
Ich bin mehr oder weniger Neuling in der Qt-Programmierung, daher folgende Anfängerfrage:
Ich habe einen Slot, der den Benutzer mit QMessageBox eine Frage stellt, und wenn der Benutzer diese Frage mit "Ja" beantwortet, muss der Slot einige Sekunden warten, bevor die nächsten Anweisungen ausgeführt werden. Dazu benutze ich den Sleep-Befehl. Das führt aber dazu, dass sich die QMessageBox zwar schließt, aber auf dem dahinter liegenden MainWindow eine hässliche leere Fläche erzeugt, bis der Sleep-Befehl vorbei ist.
Also meine Frage: gibt es einen "besseren" Sleep-Befehl, oder wie löse ich das Problem?
Vielen Dank im Voraus für alle Antworten!
Oberfläche "hängt" während Sleep-Befehl
-
- Beiträge: 32
- Registriert: 11. August 2004 12:42
Hi,
das Problem hierbei ist, dass bei einem Sleep der gesamte Prozess angehalten wird, d.h. das komplette Programm bleibt stehen. Das ist auch der Grund, weshalb es zu Hängern in Deiner graphischen Oberfläche kommt, da auch das Repainten der Oberfläche angehalten wird.
Kannst Du dass ganze vielleicht mit einem Timer (Class QTimer) lösen? Du müsstest dann beim Klick auf "Ja" den Timer starten und eben festlegen, was passieren soll.
http://doc.trolltech.com/3.3/qtimer.html
Gruß
Mike
das Problem hierbei ist, dass bei einem Sleep der gesamte Prozess angehalten wird, d.h. das komplette Programm bleibt stehen. Das ist auch der Grund, weshalb es zu Hängern in Deiner graphischen Oberfläche kommt, da auch das Repainten der Oberfläche angehalten wird.
Kannst Du dass ganze vielleicht mit einem Timer (Class QTimer) lösen? Du müsstest dann beim Klick auf "Ja" den Timer starten und eben festlegen, was passieren soll.
http://doc.trolltech.com/3.3/qtimer.html
Gruß
Mike
-
- Beiträge: 32
- Registriert: 11. August 2004 12:42
-
- Beiträge: 32
- Registriert: 11. August 2004 12:42
Hmmm, eine Frage habe ich da aber noch:
es geht um folgenden slot:
void GUI3MainWindow::test(void){
QTimer *timer_go = new QTimer( &GUI3MainWindow);
QObject::connect( timer_go, SIGNAL(timeout()), &GUI3MainWindow, SLOT(test()));
....
}
Dann bekomme ich immer die Fehlermeldung "GUI3MainWindow: Ungültige Verwendung dieses Typs als Ausdruck". Was muss ich denn korrekterweise dort angeben?
es geht um folgenden slot:
void GUI3MainWindow::test(void){
QTimer *timer_go = new QTimer( &GUI3MainWindow);
QObject::connect( timer_go, SIGNAL(timeout()), &GUI3MainWindow, SLOT(test()));
....
}
Dann bekomme ich immer die Fehlermeldung "GUI3MainWindow: Ungültige Verwendung dieses Typs als Ausdruck". Was muss ich denn korrekterweise dort angeben?
Hi,
in welcher Zeile ist der Fehler? Spontan fällt mir nur folgendes auf:
void GUI3MainWindow::test(void)
Sollte das nicht eher:
void GUI3MainWindow::test() heißen?
Ist es Absicht, dass das endlos laufen soll? Weil durch den Aufruf vom Slot, wird der Timer gestartet und dann wieder der Slot, dadurch wieder der Timer usw.
Gruß
Mike
in welcher Zeile ist der Fehler? Spontan fällt mir nur folgendes auf:
void GUI3MainWindow::test(void)
Sollte das nicht eher:
void GUI3MainWindow::test() heißen?
Ist es Absicht, dass das endlos laufen soll? Weil durch den Aufruf vom Slot, wird der Timer gestartet und dann wieder der Slot, dadurch wieder der Timer usw.
Gruß
Mike
-
- Beiträge: 32
- Registriert: 11. August 2004 12:42
Hi, habe den Fehler gefunden. Und zwar muss ich den QTimer nicht erst im Slot selbst, sondern zuvor (bei der Deklaration der dazugehörigen Klasse), also so:
class GUI3MainWindow ... {
...
QTimer meinTimer;
....
und im Slot kann ich diesen dann mit
meinTimer.start(...);
...
aufrufen!!
Vielen Dank für die Hilfe !!!!
PS: ach so, dass der Timer immer wieder aufgerufen wird (dann wäre tatsächlich eine Endlossschleife vorhanden) verhindere ich mit einer static int Variable im slot...
class GUI3MainWindow ... {
...
QTimer meinTimer;
....
und im Slot kann ich diesen dann mit
meinTimer.start(...);
...
aufrufen!!
Vielen Dank für die Hilfe !!!!
PS: ach so, dass der Timer immer wieder aufgerufen wird (dann wäre tatsächlich eine Endlossschleife vorhanden) verhindere ich mit einer static int Variable im slot...