Qt 减量计时器

Qt 减量计时器,qt,qtimer,Qt,Qtimer,我有一个QTimer,当我点击一个对象时,我想减少这个QTimer。为此,我使用start函数,该函数允许在启动计时器时停止计时器,并使用传入参数的值重新启动计时器。调用My函数,但只要计时器未达到接近4100的值,时间就不会减少。一旦达到4100(大约),它就可以正常工作了,有人知道为什么剩余时间太长时它不能工作吗 testclick.h: #ifndef TESTCLICK_H #define TESTCLICK_H #include <QMouseEvent> #includ

我有一个QTimer,当我点击一个对象时,我想减少这个QTimer。为此,我使用start函数,该函数允许在启动计时器时停止计时器,并使用传入参数的值重新启动计时器。调用My函数,但只要计时器未达到接近4100的值,时间就不会减少。一旦达到4100(大约),它就可以正常工作了,有人知道为什么剩余时间太长时它不能工作吗

testclick.h:

#ifndef TESTCLICK_H
#define TESTCLICK_H

#include <QMouseEvent>
#include <QTimer>
#include <QWidget>
#include <QDebug>

class TestClick : public QWidget
{
private :
    QTimer* timer;

public:
    TestClick();
    ~TestClick();

    void mousePressEvent (QMouseEvent* event);
};

#endif // TESTCLICK_H

我使用Qt5和Debian。

请编辑您的问题,提供一个示例代码,并澄清您所说的
减量这个QTimer的意思。
。您必须提供一些最小的示例代码。我无法复制它。从一个
main.cpp
文件开始:
#包括
intmain(intargc,char**argv){QCoreApplication-app(argc,argv);QTimer-timer;/*在此处添加内容*/return-app->exec()}
“递减”一个
QTimer
意味着使计时器超时比预期的时间早。这就是你的意思吗。您可能会在代码中的某个地方阻塞—回想一下,只有当控件位于
QCoreApplication::exec
中时,才会发出计时器超时信号,而不是在您自己的代码中。如果您的代码在任何地方阻塞,即等待内容而不返回到
exec
,这就是问题所在。你怎么知道?非常简单:当发生“错误”情况时暂停程序,并检查您自己的代码是否在上面的调用堆栈上
exec
:在一般情况下,不应该是这样。我直接运行了您的代码,它对我来说运行正常。我在MSVC 2017 windows 10中使用了Qt 5.12.3。我想知道计时器的停止然后启动是否需要一些时间来处理,因此当您打印
after
debug语句时,它可能仍在抓取计时器对象,因为它处于挂起状态,所以只使用它最后一次已知的剩余时间。我尝试使用Qt::PreciseTimer,效果很好。谢谢你的帮助!
#include "testclick.h"

TestClick::TestClick()
{
    timer = new QTimer();
    timer->start(8000);
}

TestClick::~TestClick()
{
    delete timer;
}

void TestClick::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"before remainingTime :"<<timer->remainingTime();
    timer->start(timer->remainingTime() - 200);
    qDebug()<<"after remainingTime :"<<timer->remainingTime();
}
#include "testclick.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TestClick test;
    test.show();

    return a.exec();
}
before remainingTime : 5260
after remainingTime : 5260
before remainingTime : 4908
after remainingTime : 4908
before remainingTime : 4780
after remainingTime : 4780
before remainingTime : 4660
after remainingTime : 4660
before remainingTime : 4508
after remainingTime : 4508
before remainingTime : 4348
after remainingTime : 4348
before remainingTime : 4196
after remainingTime : 3996
before remainingTime : 3836
after remainingTime : 3636
before remainingTime : 3476
after remainingTime : 3276
before remainingTime : 3116
after remainingTime : 2916
before remainingTime : 2740
after remainingTime : 2540
before remainingTime : 2380
after remainingTime : 2180
before remainingTime : 2012