_ZNote_Qt_定时器的总结
Qt中實現定時器有兩種方法.
一種是使用QObject類定時器;一種是使用QTimer類定時器.(定時器的精度依賴于操作系統和硬件,大多數平臺支持20ms)
1,QObject類定時器.
通過QObject::startTimer(),可以把一個一毫秒為單位的時間間隔作為參數來開始定時器,這個函數返回一個唯一的整數定時器的標識符。這個定時器開始就會在每一個時間間隔"觸發",直到明確的使用這個定時器的標識符來調用QObject::killTimer()結束。?當定時器觸發時,應用程序會發送一個QTimerEvent。在事件循環中,處理器按照事件隊列的順序來處理定時器事件。當處理器正忙于其它事件處理時,定時器就不能立即處理。
?
int QObject::startTimer(int interval); //開始一個定時器并返回定時器ID,如果不能開始一個定時器,將返回0。 //定時器開始后,每隔interval毫秒間隔將觸發一次超時事件,直到killTimer()被調用來刪除定時器。 //如果interval為0,那么定時器事件每次發生時沒有窗口系統事件處理。?
?
?
virtual void QObject::timerEvent(QTimerEvent *event); // 虛函數timerEvent()被重載來實現用戶的超時事件處理函數。 // 如果有多個定時器在運行,QTimerEvent::timerId()被用來查找指定定時器,對其進行操作。 // 當定時器事件發生時,虛函數timerEvent()隨著QTimerEvent事件參數類一起被調用,重載這個函數可以獲得定時器事件。?
?
?
void killTimer(int id); //通過定時器標識符來殺死定時器。?
?
實例:
// .h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>namespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_clicked();private:void timerEvent(QTimerEvent *t);Ui::MainWindow *ui;int m_nTimerId1;int m_nTimerId2;int m_nTimerId3; };#endif // MAINWINDOW_H/ .cpp ///#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtCore> #include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);m_nTimerId1 = startTimer(1000);m_nTimerId2 = startTimer(5000);m_nTimerId3 = startTimer(10000);//有教程說直接按照順序,幾個定時器,就返回幾.但實際上并不一定這樣. }MainWindow::~MainWindow() {delete ui; }void MainWindow::timerEvent(QTimerEvent *t)//定時器時間 {int id = t->timerId();qDebug() <<id;if(id == m_nTimerId1) ui->label->setText(tr("每秒產生一個隨機數:%1").arg(qrand()%10));if(id == m_nTimerId2) ui->label_2->setText(tr("5秒后軟件將關閉"));if(id == m_nTimerId3) qApp->quit();/*switch(t->timerId())//判斷定時器的句柄{//qrand(),可以產生隨機數//qrand()%10可以產生0~9之間的隨機數//要想產生100以內的隨機數就得%100case 2:ui->label->setText(tr("每秒產生一個隨機數:%1").arg(qrand()%10));break;case 3:ui->label_2->setText(tr("5秒后軟件將關閉"));break;case 4:qApp->quit();break;//退出系統}*/ }void MainWindow::on_pushButton_clicked() {if(m_nTimerId1 != 0)killTimer(m_nTimerId1);if(m_nTimerId2 != 0)killTimer(m_nTimerId2);if(m_nTimerId2 != 0)killTimer(m_nTimerId2); }實現效果:
2,QTimer類實現
QTimer類定時器是QObject類定時器的擴展版或者說升級版,因為它可以提供更多的功能。比如說,它支持單次觸發和多次觸發。
使用QTimer類定時器的步驟:
(1)創建一個QTimer定時器實例:QTimer *timer = new QTimer(this);
(2)連接超時信號與槽:connect(timer, SIGNAL(timeout()), this, SLOT(testFunc()));
(3)啟動定時器start(); 定時器有兩種??start(int time)? 和??setSingleShot(true)? 前者表示重復觸發,除非stop關閉. 后者僅僅啟動一次.
(4)適時關閉定時器:stop();
(5)刪除定時器實例:delete timer;
?
例如:
?
///// .h // #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtCore> #include <QMainWindow>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = 0);~MainWindow();private slots:void timerUpdate(); private:QTimer *timer;int timerInt; };#endif // MAINWINDOW_H/// .cpp / #include "mainwindow.h" #include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {timer = new QTimer(this); //新建定時器 connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));//關聯定時器計滿信號和相應槽函數timer -> start(1000);//定時器開始,1000ms觸發一次timerInt = 0; }MainWindow::~MainWindow() {}void MainWindow::timerUpdate() {QDateTime time = QDateTime::currentDateTime();//獲取系統現在的時間QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");//設置系統時間顯示格式// ui->label->setText(str);//在標簽上顯示時間qDebug() << str;if(timerInt++ == 5){if(timer ->isActive()){timer -> stop();//停止運行 }} }?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/zpsoe/p/7080697.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的_ZNote_Qt_定时器的总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异步编程的实现方式
- 下一篇: Oracle备份提示,EXP-00091