定时器事件

虽然绝大多数的其他事件类型的发生是因为用户的动作,但是定时器事件允许应用程序可以在一定的时间间隔后执行事件处理。定时器事件可以用来实现光标的闪烁和其他动画的播放,或者只简单地用作显示的刷新。

为了说明定时器事件,我们将实现一个Ticker窗口部件,这个窗口部件显示了一串文本标语,它会每30毫秒向左移动一个像素。如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止。

Ticker.h

#ifndef TICKER_H
#define TICKER_H#include <QWidget>class Ticker : public QWidget
{Q_OBJECTQ_PROPERTY(QString text READ text WRITE setText)public:Ticker(QWidget *parent = 0);void setText(const QString &newText);QString text() const { return myText; }QSize sizeHint() const;protected:void paintEvent(QPaintEvent *event);void timerEvent(QTimerEvent *event);void showEvent(QShowEvent *event);void hideEvent(QHideEvent *event);private:QString myText;int offset;int myTimerId;
};#endif

Ticker.cpp

#include <QtGui>#include "ticker.h"Ticker::Ticker(QWidget *parent): QWidget(parent)
{//构造函数把offset变量初始化为0.用来绘制文本的x坐标值就取自于这个offset值offset = 0;//定时器的ID通常是非零的,所以可以使用0来表示定时器还没有启动myTimerId = 0;
}void Ticker::setText(const QString &newText)
{myText = newText;update();//执行重绘操作updateGeometry();//通知对Ticker窗口部件负责的任意布局管理器,提示该窗口部件的大小发生了变化
}QSize Ticker::sizeHint() const
{return fontMetrics().size(0, text());
}void Ticker::paintEvent(QPaintEvent * /* event */)
{//创建一个QPainter对象QPainter painter(this);//获得文本的宽度(即文本的长度)int textWidth = fontMetrics().width(text());if (textWidth < 1)//文本的得长度小于1,即文本为空return;int x = -offset;while (x < width()) {painter.drawText(x, 0, textWidth, height(),Qt::AlignLeft | Qt::AlignVCenter, text());x += textWidth;//将文本出现的水平坐标向后移动}
}void Ticker::showEvent(QShowEvent * /* event */)
{myTimerId = startTimer(30);
}void Ticker::timerEvent(QTimerEvent *event)
{if (event->timerId() == myTimerId) {++offset;if (offset >= fontMetrics().width(text()))offset = 0;scroll(-1, 0);} else {QWidget::timerEvent(event);}
}void Ticker::hideEvent(QHideEvent * /* event */)
{//QObject::killTimer()用来停止定时器killTimer(myTimerId);myTimerId = 0;
}

setText()
setText()函数用来设置要显示的文本。它调用update()函数强制执行一个重绘操作,并且调用updateGeometry()。通知对Ticker窗口部件负责的任意布局管理器,提示该窗口部件的大小发生了变化。

sizeHint()
sizeHint()函数返回文本所需的空间大小,并以此作为窗口部件的理想尺寸。QWidget::fontMetrics()函数返回一个QFontMetrics对象,可以利用这个对象查询并获得与这个窗口部件字体相关的信息。在这种情况下,可以询问给定文本所需的必要大小。QFontMetrics::size()的第一个参数是一个标识符,对于那些比较简单的字符串来讲并不需要它,因而只给它传递了一个0值。

paintEvent()
paintEvent()函数使用drawText()绘制文本。它使用fontMetrics()确定文本在水平方向上所需的空间,并且在考虑offset值的同时,多次绘制文本,直到能够条填充整个窗口部件的宽度为止。

showEvent()
showEvent()函数用来启动一个定时器。QObject::startTimer()调用会返回一个ID数字,可以在以后用这个数字识别该定时器。

timerEvent()
系统每个一定的时间,都会调用一次timerEvent()函数。它通过在offset上加1来模拟移动,从而形成文本宽度的连续滚动。然后,它使用QWidget::scroll()把窗口部件的内容向左滚动一个像素。

hideEvent()
hideEvent()函数调用QObject::killTimer()来停止该定时器。

main.cpp

#include <QApplication>#include "ticker.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);Ticker ticker;ticker.setWindowTitle(QObject::tr("Ticker"));ticker.setText(QObject::tr("How long it lasted was impossible to ""say ++ "));ticker.show();return app.exec();
}


定时器事件是一种低级事件,而且如果需要多个定时器时,保持对所有定时器ID的跟踪将会变得很麻烦。在这种情况下,通常更为简单的方式是为每一个定时器分别创建一个Q对象。
QTimer 会在每个时间间隔发射 timeout( )信号。 QTir阳也提供了一个非常方便的接口,可用:于单触
发定时器(只触发一次的定时器) ,就像第 章(见 122 页)中看到的那样。

Qt4_Ticker定时器事件相关推荐

  1. QT学习笔记(七):定时器事件的3种常用使用方式

    QT学习笔记(七):定时器事件的2种常用使用方式 Qt中定时器的使用有2种方法:一种是使用QObject类提供的定时器通过重载 timerEvent 事件处理过程函数,一种就是使用QTimer类. 其 ...

  2. Nginx学习之十-超时管理(定时器事件)

    Nginx事件管理主要是网络事件和定时器事件.下面介绍定时器事件管理,即超时管理. 为什么要进行超时管理 Nginx有必要对可能发生超时的事件进行统一管理,并在事件超时时作出相应的处理,比如回收资源, ...

  3. HS6621CG定时器事件调度

    HS6621CG定时器事件调度 例程 一.Schedule 二.TIMER 2.1 定时单位 2.2 设置timer 例程 生成一个定时器事件,每隔100毫秒运行一次函数 co_timer_t sim ...

  4. 【第十二篇】Flowable事件-定时器事件

    Flowable事件   事件(event)通常用于为流程生命周期中发生的事情建模.事件总是图形化为圆圈.在BPMN 2.0中,有两种主要的事件分类:*捕获(catching)与抛出(throwing ...

  5. CAPL: 定时器事件

    定时器类型 timer:以秒为单位 msTimer:以毫秒为单位 定义定时器 Variable { timer 定时器名字; msTimer 定时器名字; } 设置计时器的时间 setTimer:设置 ...

  6. qt-重写event(),事件过滤器,定时器,事件总结

    一.认识事件 1.事件(event) 是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如 ...

  7. 【Qt教程】3.2 - Qt5 event事件、定时器timerEvent

    Qt定时器与winform不一样,Qt中的定时器需要代码创建. GitHub源码仓库:Qt学习例程 1. Qt定时器事件的使用 Qt中定时器的创建和使用有两种使用方式: 第一种:(不常用,没有什么控制 ...

  8. 在Node.js中使用事件,监听器,定时器和回调

    Node.js通过其强大的事件驱动模型提供了可扩展性和性能,本篇文章的重点是理解该模型,以及它是如何不同于大部分Web服务器采用的传统线程模型的.了解事件模型至关重要,因为它可能迫使你改变设计应用程序 ...

  9. JS 总结之事件循环

    众所周知,JavaScript 为了避免复杂,被设计成了单线程. ⛅️ 任务 单线程意味着所有任务都需要按顺序执行,如果某个任务执行非常耗时,线程就会被阻断,后面的任务需要等上一个任务执行完毕才会进行 ...

最新文章

  1. ubuntu linux下解决“no java virtual machine was found after searching the following locations:”的方法
  2. MVC系列——一个异常消息传递引发的思考
  3. 计算feature map大小
  4. chromium浏览器_Chromium版Edge浏览器正式上线:安装包仅2.2MB
  5. struts2和springmvc实现文件上传
  6. Service Mesh服务网格:是什么和为什么
  7. .NET静态代码织入——肉夹馍(Rougamo)
  8. eclipse安装Hadoop-0.20.2插件
  9. 系统集成项目管理工程师历年案例考试汇总
  10. 账户验证业务规则及改造要点介绍
  11. 斐波那契数列Java
  12. [JSMind]使用JSMind操作生成的思维导图
  13. 少模光纤模式场的计算
  14. 联想计算机BIOS启动顺序boot,联想电脑BIOS启动项如何设置U盘启动_联想电脑BIOS启动项设置U盘启动教程介绍...
  15. 了解一下Windows Cracker
  16. qq群文件问题完美解决
  17. 微带线等效电感仿真与设计
  18. Python这么强大, 怎样快速学习?
  19. 输入框采用自动填充数据后,变成浅黄色背景
  20. matlab通过数据进行曲线拟合 导出公式

热门文章

  1. C语言-Ubuntu下GDB与GCC的安装与使用
  2. Mybatis-Pagehelper
  3. Spring-@Value
  4. Linux C基础笔记(3)
  5. java 内存情况_Java代码中获取运行时内存情况
  6. python程序间通信_python进程间通信Queue工作过程详解
  7. k1075停运吗_列车停运计划
  8. c语言编程指法输入,C语言 课件 第一章引论.pdf
  9. mysql8.0版本的服务器名称_MySQL 8.0安装部署-运维笔记
  10. python中打乱顺序的函数_numpy.random.shuffle打乱顺序函数的实现