Сначала мы создаем помощник, который обнаруживает пересечения вверх:
class DetectUpwardsCrossing : public QObject {
public:
DetectUpwardsCrossing(double threshold, QObject *parent = nullptr) : QObject(parent), threshold(threshold), current(qSNaN()) {}
signals:
void crossing();
public slots:
void onSignal(double value) {
if (qIsNaN(current)) {
current = value;
return;
}
if (current == value) {
return;
}
bool before = current <= threshold;
current = value;
bool after = current >= threshold;
if (before && after) {
emit crossing();
}
}
private:
double threshold, current;
};
Теперь создайте экземпляр DetectUpwardsCrossing
, подключите значение входящего сигнала к onSignal
и подключите его сигнал crossing
к следующий метод:
void onCrossing() {
QSound::play(":/res/beep1.wav"); // make a beep sound
if (crossingTimer->isActive()) { // The timer is still running, so we are within the 3s period
ui->rdo_btn_vertical->setStyleSheet(StyleSheetOn1); // change appearance of a radio button
}
crossingTimer->restart();
}
void crossingTimerExpire() {
ui->rdo_btn_vertical->setStyleSheet(StyleSheetOff1);
crossingTimer->stop();
}
Последний фрагмент - это QTimer *crossingTimer
с интервалом в 3 секунды, чей сигнал timeout
подключается к crossingTimerExpire
.
Используя с таким таймером, вы можете гарантировать, что дисплей "выключится", если вы внезапно перестанете получать сигналы.