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