_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); //通过定时器标识符来杀死定时器。
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | ////// .h //////// #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public : 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以内的随机数就得%100 case 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_OBJECT public: 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();//停止运行 } } }
posted on 2017-06-26 15:11 ZhangDezhi 阅读(315) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?