Qt QTimer定時器

斷點_Dream2017發表於2020-12-10

    在Qt開發介面的時候,非常多的時候都得使用定時器,定時器具體可以幹什麼呢?比如:控制時鐘、定時改變樣式、改變進度等。。。說到這裡,經常使用QQ,而不同的時段都會顯示不同的背景,我認為如果用Qt實現的話,就得使用QTimer定時的獲取時間,判斷當前時間為morning、noon、afternoon、night來改變當前的背景。。。

    雖然QTimer簡單易用,但是比較耗記憶體,所以在不必要的時候就必須終止它。。。

Qt中定時器的使用有兩種方法,一種是使用QObject類提供的定時器,還有一種就是使用QTimer類。
其精確度一般依賴於作業系統和硬體,但一般支援20ms。下面將分別介紹兩種方法來使用定時器。

方法一:QObject中的定時器的使用,需要用到三個函式

1、 int QObject::startTimer ( int interval ) ;

 這個是開啟一個定時器的函式,他的引數interval是毫秒級別。當開啟成功後會返回這個定時器的ID, 並且每隔interval 時間後會進入timerEvent 函式。直到定時器被殺死。

2、 void QObject::timerEvent ( QTimerEvent * event );

 當定時器超時後,會進入該事件timerEvent函式,需要重寫timerEvent函式,在函式中通過判斷event->timerId()來確定定時器,然後執行某個定時器的超時函式。

3、 void QObject::killTimer ( int id );

  通過從startTimer返回的ID傳入killTimer 函式中殺死定時器,結束定時器進入超時處理。

以下是QObject中的定時器具體使用簡單例子:

  #define _MYTIMER_H  
     
  #include <QObject>  
    
  class MyTimer : public QObject  
  {  
      Q_OBJECT  
    
  public:  
      MyTimer(QObject* parent = NULL);  
      ~MyTimer();  
      void  handleTimeout();  //超時處理函式  
      virtual void timerEvent( QTimerEvent *event);  
  private:  
      int m_nTimerID;  
  };  
    
  #endif //_MYTIMER_H  

   

#include "mytimer.h"  
      
 #include<QDebug>   
 #include <QTimerEvent>  
   
 #define TIMER_TIMEOUT   (5*1000)  
   
 MyTimer::MyTimer(QObject *parent)  
     :QObject(parent)  
 {  
     m_nTimerID = this->startTimer(TIMER_TIMEOUT);  
 }  
   
 MyTimer::~MyTimer()  
 {  
       
 }  
   
 void MyTimer::timerEvent(QTimerEvent *event)  
 {  
     if(event->timerId() == m_nTimerID){  
         handleTimeout();  
     }  
 }  
   
 void MyTimer::handleTimeout()  
 {  
     qDebug()<<"Enter timeout processing function\n";  
     killTimer(m_nTimerID);  
 }  

方法二:使用QTimer定時器類

//實現程式碼

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QDebug>
#include <QDateEdit>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public slots:
    void handleTimeout();  //超時處理函式
private:
    Ui::MainWindow *ui;
    QTimer *timer;
};
#endif // MAINWINDOW_H


#include "mainwindow.h"
#include "ui_mainwindow.h"
#define TIMER_TIMEOUT	(5*1000)
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(handleTimeout()));
    timer->start(TIMER_TIMEOUT);


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handleTimeout()
{
    qDebug()<<"Enter timeout processing function\n";
    if(timer->isActive()){
        timer->stop();
    }
	
	qDebug()<<ui->dateEdit->date();
}

轉載自:

https://blog.csdn.net/qq_28877125/article/details/88389559

 

 

相關文章