QTimer插槽触发了多个时间?

时间:2019-05-05 14:00:34

标签: qt raspberry-pi qtimer qt5.12

我正在为Raspberry PI创建UI应用程序,以在确定的超时(5秒)内从传感器读取数据。问题是QTimer超时插槽被多次调用

{   //at system init
readTempCur = new QTimer(this);
connect(readTempCur, SIGNAL(timeout()), this, SLOT(readSensor()));
readTempCur->start(SAMPLINGTIME);
readSensor();   //added to call on boot itself, can be removed
}
void HomePage::readSensor(void) {
   readTempCur->stop();
   qDebug() << "Read Sensor triggerred at " <<QDateTime::currentDateTime().toString();
   //DO my actions
   readTempCur->start(SAMPLINGTIME);
 }

Screenshot for QTimer triggered multiple times

[答案编辑] 这种问题最可能的情况是将时隙连接到已经连接的信号上。它将在连接n次后触发插槽,因此设计时应注意不要再次连接。

2 个答案:

答案 0 :(得分:1)

QTimer::start函数将启动/重新启动计时器。

您的readSensor函数会停止计时器,然后重新启动。

删除start进行修复。

void HomePage::readSensor(void) {
   readTempCur->stop();
   qDebug() << "Read Sensor triggerred at " <<QDateTime::currentDateTime().toString();
   //DO my actions
   //readTempCur->start(SAMPLINGTIME);
 }

P.S。 如果您想一次运行计时器,则可以使用singleShoot

QTimer::singleShot(SAMPLINGTIME, this, SLOT(readSensor()));

答案 1 :(得分:0)

请勿停止或重新启动readSensor()中的计时器。只要做:

void HomePage::readSensor(void)
{
    qDebug() << "Read Sensor triggerred at " <<QDateTime::currentDateTime().toString();
    //DO my actions
}

还要确保以毫秒为单位给出SAMPLINGTIME。在5秒钟内,SAMPLINGTIME应该为5000。