2017-11-27 1 views
2

Ich schreibe eine App für Relais-Controller. Ich habe eine Funktion, die/schließt Relais öffnet:QTimer, parametrisierter Steckplatz

void setRelay(unsigned int relay_number, bool state); 

Jetzt möchte ich einige Taste, um ein Relais zu öffnen für sagen 1sek lässt.

Ich möchte wie dies th etw:

void on_button_clicked() 
{ 
    setRelay(1, true); 
    QTimer::singleShot(1000,this,SLOT(setRelay(1,false))) 
} 

Ja, ich weiß, dass die Signale nicht funktionieren auf diese Weise. Gibt es eine Möglichkeit, das vom Timer ausgegebene Signal zu ändern, so dass ein Relais geschlossen wird. Nächste, was ich kam, ist dies:

QTimer::singleShot(1000,this,SLOT(relay_1_off())); 

und dann muss ich einen Schlitz pro Relais machen es zu schließen:

void relay_1_off(){ 
    setRelay(1,false); 
} 

Könnte es, ohne dass so viele Slots durchgeführt werden, haben jemand einige mehr schlauer Weg? Grüße

+0

Was ist die Version von Qt Was haben Sie? – eyllanesc

+0

Ich verwende die neueste Version 5.9. –

Antwort

3

Wenn Sie QT5 verwenden Sie die Lambda-Funktionen verwenden können:

void QTimer::singleShot(int msec, Functor functor)

QTimer::singleShot(1000, [&](){ 
    setRelay(1,false); 
}); 
+0

Das ist es, vielen Dank :) –

+0

Ist [&] wirklich notwendig? Ich denke [] wird in diesem Fall tun. – scopchanov

+2

Sie müssen den Kontext übergeben, wenn setRelay eine Methode von 'this' ist, dann ist es genug, um es an Sie zu übergeben:' QTimer :: singleShot (1000, [this]() {' – eyllanesc

Verwandte Themen