Qt 创建定时器

一,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

https://cloud.tencent.com/developer/article/1137386

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值