QTimer, параметризованный слот

Я пишу приложение для релейного контроллера. У меня есть функция, которая открывает/закрывает реле:

void setRelay(unsigned int relay_number, bool state);

Теперь я хочу сделать кнопку, чтобы открыть реле, скажем, на 1 сек.

Я хочу сделать что-то вроде этого:

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

Да, я знаю, что сигналы так не работают. Есть ли способ изменить сигнал, излучаемый таймером, чтобы он замкнул реле. Самое близкое, что я придумал, это:

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

а затем мне нужно сделать слот для каждого реле, чтобы закрыть его:

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

Можно ли это сделать, не делая столько слотов, у кого-нибудь есть более хитрый способ? Привет


person karollo    schedule 27.11.2017    source источник
comment
Какая у вас версия Qt?   -  person eyllanesc    schedule 27.11.2017
comment
Я использую самую новую версию 5.9.   -  person karollo    schedule 27.11.2017


Ответы (1)


Если вы используете Qt5, вы можете использовать лямбда-функции:

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

QTimer::singleShot(1000, [&](){
    setRelay(1,false);
});
person eyllanesc    schedule 27.11.2017
comment
Действительно ли необходимо [&]? Я думаю, [] подойдет в этом случае. - person scopchanov; 27.11.2017
comment
Вы должны передать ему контекст, если setRelay является методом this, то достаточно передать его вам: QTimer::singleShot(1000, [this](){ - person eyllanesc; 27.11.2017
comment
@KarolŻurowski Если это сработало для вас, не забудьте отметить мой ответ как правильный. - person eyllanesc; 28.11.2017
comment
Я точно знал. Спасибо еще раз :) - person karollo; 28.11.2017
comment
@KarolŻurowski Нет, проверьте следующую ссылку, чтобы увидеть, как ответ помечен как правильный: tour: P - person eyllanesc; 28.11.2017