QTimer: SingleShot und isActive

Alles rund um die Programmierung mit Qt
Antworten
Ozzy
Beiträge: 141
Registriert: 24. Oktober 2007 10:18

QTimer: SingleShot und isActive

Beitrag 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?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Ozzy
Beiträge: 141
Registriert: 24. Oktober 2007 10:18

Beitrag 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?
Ozzy
Beiträge: 141
Registriert: 24. Oktober 2007 10:18

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