一,QTimer::singleShot
Static Public Members:
void singleShot(int msec, const QObject *receiver, const char *member)
void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
void singleShot(int msec, const QObject *receiver, PointerToMemberFunction method)
void singleShot(int msec, Qt::TimerType timerType, const QObject *receiver, PointerToMemberFunction method)
void singleShot(int msec, Functor functor)
void singleShot(int msec, Qt::TimerType timerType, Functor functor)
void singleShot(int msec, const QObject *context, Functor functor)
void singleShot(int msec, Qt::TimerType timerType, const QObject *context, Functor functor)
void singleShot(std::chrono::milliseconds msec, const QObject *receiver, const char *member)
void singleShot(std::chrono::milliseconds msec, Qt::TimerType timerType, const QObject *receiver, const char *member)
QTimer::singleShot(600000, &app, SLOT(quit()));
这是一次性定时器。到了定时间隔之后只发送一次信号,槽函数只处理一次
二,QObject中的startTimer
int QObject::startTimer(int interval); //启动定时器,并设置定时器间隔时间(单位ms),启动后返回该定时器ID号. void QObject::timerEvent(QTimerEvent * event); //定时器处理函数,需要用户来重写它,如果有多个定时器,可以通过QTimerEvent::timerId()来判断定时器ID处理 void killTimer(int id); //通过定时器ID号来杀掉某个定时器
class Widget2 : public QWidget
{
Q_OBJECT
public:
Widget2(QWidget* parent = 0 ):QWidget(parent),
timeID(0)
{
QPalette palette (this->palette());
palette.setBrush(QPalette::Background, QBrush(QColor(100,12,130)));
this-> setPalette( palette );
//2. 创建定时器
timeID = startTimer(100,Qt::PreciseTimer);
}
~Widget2(){}
protected:
// 3. 重写定时器事件,接收定时的到来
void timerEvent(QTimerEvent *event)
{
// 4. 判断是否为这个定时器ID(系统可能有多个定时器Id、这种方式启动的话、全放在这里处理)
if(event->timerId() == timeID)
{
//TODO function
if(timeID)
killTimer(timeID);// 5.杀死定时器
timeID = 0;
}
}
private:
int timeID;//1. 声明定时器ID
};
三,QTimer
- QTimer类提供了重复的、单发的计时器。
- QTimer类为计时器提供了一个高级编程接口。要使用它,创建一个QTimer,将其timeout()信号连接到适当的插槽,并调用start()。从那时起,它将以恒定的间隔发出timeout()信号。
- 计时器的准确性取决于底层操作系统和硬件。大多数平台都支持1毫秒的分辨率,但在许多实际情况下,计时器的精度无法达到这个分辨率。
- 准确度也取决于定时器的类型。对于Qt::PreciseTimer, QTimer将尝试保持精度在1毫秒。精确的定时器也永远不会比预期提前超时。
void setSingleShot(bool singleShot); // 设置使能单次触发和多次触发,默认情况为多次触发 bool isActive(); //判断定时器是否运行 bool setInterval ( int msec ); //从新设置间隔时间
class Widget3 : public QWidget
{
Q_OBJECT
public:
Widget3(QWidget* parent = 0 ):QWidget(parent),
m_pTimer(nullptr)
{
m_pTimer = new QTimer;// 2. 创建定时器对象
m_pTimer->setTimerType(Qt::PreciseTimer); // 3.设置定时器对象精确度模式
connect(m_pTimer,SIGNAL(timeout()),this,SLOT(timeOut_Slots()));// 4. 连接定时器超时后处理的槽函数
m_pTimer->start(100);// 5. 开启定时器
}
~Widget3(){}
public slots:
//6. 定时器槽函数
void timeOut_Slots()
{
//TODO function
if(m_pTimer)
killTimer(m_pTimer->timerId());//7. 杀死定时器
delete m_pTimer;
m_pTimer = NULL;
}
private:
QTimer* m_pTimer;//1. 声明定时器对象指针
};
参考:https://blog.csdn.net/liuzhezhe111/article/details/82285146