我最近寫了一個秒錶,並注意到一些奇怪的行爲QDateTime::secsTo
。我不確定它是一個錯誤還是一個功能(或者我只做了一個糟糕的實現;-)。QDateTime :: secsTo爲不同的QDateTime返回相同的值
我的秒錶代碼可以被剝離下來,以該最小示例(使用Qt 5.7.1至少在Linux上)以產生可疑結果:
StopWatch.h
#ifndef STOPWATCH_H
#define STOPWATCH_H
#include <QDialog>
#include <QDateTime>
class QTimer;
class StopWatch : public QDialog
{
Q_OBJECT
public:
explicit StopWatch(QWidget *parent);
private slots:
void update();
private:
QTimer *m_timer;
QDateTime m_targetTime;
};
#endif // STOPWATCH_H
秒錶的.cpp
#include "StopWatch.h"
#include <QDebug>
#include <QTimer>
StopWatch::StopWatch(QWidget *parent) : QDialog(parent)
{
m_timer = new QTimer(this);
m_timer->setTimerType(Qt::PreciseTimer);
connect(m_timer, &QTimer::timeout, this, &StopWatch::update);
m_targetTime = QDateTime::currentDateTime().addSecs(10);
m_timer->start(1000);
}
void StopWatch::update()
{
QDateTime currentDateTime = QDateTime::currentDateTime();
qint64 secondsLeft = currentDateTime.secsTo(m_targetTime);
qDebug() << secondsLeft;
}
而這裏的輸出(部分):
4
3
2
1
0
0
-1
-2
-3
-4
所以我們在這裏:QDateTime::secsTo
輸出0
爲同一QDateTime
和的前QDateTime
一秒。
我工作圍繞這個做
if (currentDateTime <= m_targetTime) {
secondsLeft++;
}
,但我不明白的behavoir。爲什麼會這樣?
舍入問題?也許你不會一秒鐘開始。 – drescherjm
它總是一樣的。試試這段代碼 - 在添加解決方法之前,我經常運行它... –
如果我有一個最好的猜測,那就是QDateTime :: secsTo()會用正整數/負整數做一些奇怪的事情。它看起來像是對負數做整數上限,對正數做整數平方。嘗試切換到mSecsTo並回報。 – user2836202