Seite 1 von 1

QTimer: SingleShot und isActive

Verfasst: 11. Dezember 2007 08:00
von Ozzy
Hi,

ich habe einen QSlider, bei dessen Bewegung jedes Mal eine Funktion aufgerufen wird, deren Bearbeitung etwas länger dauert. Da mir dadurch ständig Werte verloren gehen, da einige "Slider-Bewegungen" kommen, während die Funktion noch rechnet, wollte ich einen QTimer einbauen. Jetzt habe ich es erst einmal so gemacht:

Code: Alles auswählen

if ( !( timer->isActive() ) ) timer->start(1000);
else {
	timer->stop();
	timer->start(1000);
}
connect(timer, SIGNAL(timeout()), this, SLOT( changeTabSlot() ));
Nun geht er auch nach 1000ms in die changeTabSlot()-Funktion rein, aber er führt sie nicht nur einmal aus, sondern dann auch so häufig, wie ich den Slider bewegt habe. Könnt Ihr mir sagen, wo da mein Fehler ist???

MfG, Ozzy

P.S. habe gerade festegellt, dass der timer jedesmal eine neue ID bekommt. Steht ja auch in der Doku: "Setting the interval of an active timer changes its timerId()." Aber wie umgeht man das dann, das die Funktion häufiger aufgerufen wird?

Verfasst: 11. Dezember 2007 08:37
von macman
Wenn Du das wirklich so gemacht hast, dann gibt es so viele connects wie Sliderbewegungen. Es ist also nicht der Timer das Problem, sondern die Anzahl der connects.

Verfasst: 11. Dezember 2007 08:46
von Ozzy
Hm, du hast natürlich völlig recht!
Ich habe das jetzt so gemacht, dass ich am Anfang des MainWindow den Timer initialisiere:

Code: Alles auswählen

timer = new QTimer( this );
connect(timer, SIGNAL(timeout()), this, SLOT( changeTabSlot() ));
timer->setInterval(1000);
Und dann im Slot nach der Sliderbewegung:

Code: Alles auswählen

		if ( !( timer->isActive() ) ) {
			timer->start();
		}
		else {
			timer->stop();
			timer->start();
		}
Viel gelöst hat es aber nicht, wird im Abstand einer Sekunde die Methode aufgerufen, und zwar eben so häufig, wie Bewegungen waren...

Kannst Du mir dabei noch einmal helfen?

Verfasst: 11. Dezember 2007 08:48
von Ozzy
ARGGHHH!!! Hatte ausversehen das

Code: Alles auswählen

timer->stop();
in der aufgerufenen Funktion auskommentiert; na dann kann das ja auch nichts werden...

Vielen Dank aber für Deine Hilfe!!!