事件(event)是由串口系统或者Qt自身产生的,用以响应所发生的各类事情。当用户按下或者松开键盘或者鼠标上的按键时,就可以产生一个键盘或者鼠标事件;当某个窗口第一次显示的时候,就会产生一个绘制事件。用来告知窗口需要重绘制它本身,从而使得该窗口可见。

使用Qt进行编程开发时,基本不需要考虑事件,Qt窗口部件都会发射信号。但是当我们需要编写自己的自定义窗口部件,或者是当我们希望改变已经存在的Qt窗口部件的行为时,事件就变得非常有用了。

事件和信号是两个概念。在使用窗口部件时,信号是十分有用的,而在实现窗口部件时,事件则是十分有用的。

7.1重新实现事件处理器

在Qt中,事件就是QEvent子类的一个实例。

7.2安装事件过滤器

Qt事件模型一个非常强大的功能是:QObject实例在看到它自己的事件之前,可以通过设置另外一个QObject实例先监视这个事件。

7.3处理密集时的相应保持

当调用QApplication:exec()时,就启动了Qt的事件循环。在开始时,Qt会发出一些事件命令来显示和绘制窗口部件。在这之后,事件循环就开始运行,它不断检查是否有事件发生并且把这个事件发送给应用程序的QObject。

定时器事件,定时器事件允许应用程序可以再一定的时间间隔后执行事件处理。定时器事件可以用来实现光标的闪烁和其他动画的播放,或者只简单地用作显示的刷新。

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

源码如下:

ticker.h

  1. #ifndef TICKER_H
  2. #define TICKER_H
  3. #include <QWidget>
  4. class Ticker : public QWidget
  5. {
  6. Q_OBJECT
  7. Q_PROPERTY(QString text READ text WRITE setText)
  8. public:
  9. Ticker(QWidget *parent = 0);    //析构
  10. void setText(const QString &newText);   //设置要显示的文本
  11. QString text() const { return myText; }
  12. QSize sizeHint() const;
  13. protected:
  14. void paintEvent(QPaintEvent *event);
  15. void timerEvent(QTimerEvent *event);
  16. void showEvent(QShowEvent *event);
  17. void hideEvent(QHideEvent *event);
  18. private:
  19. QString myText;
  20. int offset;
  21. int myTimerId;
  22. };
  23. #endif

ticker.cpp

  1. #include <QtGui>
  2. #include "ticker.h"
  3. Ticker::Ticker(QWidget *parent)
  4. : QWidget(parent)
  5. {
  6. offset = 0;
  7. myTimerId = 0;
  8. }
  9. void Ticker::setText(const QString &newText)    //设置要显示的文本
  10. {
  11. myText = newText;
  12. update();   //强制执行一个重绘操作
  13. updateGeometry();   //通知对Ticker窗口部件负责的任意布局管理器,提示该窗口部件的大小发生了变化。
  14. }
  15. QSize Ticker::sizeHint() const  //返回文本所需的空间大小,并以此作为窗口部件的理想尺寸。
  16. {
  17. return fontMetrics().size(0, text());   //返回一个QFontMetrics对象,可以用这个对象查询并获得与这个窗口部件字体相关的信息
  18. }
  19. void Ticker::paintEvent(QPaintEvent * /* event */)  //使用QPainter::drawText()绘制文本
  20. {
  21. QPainter painter(this);
  22. int textWidth = fontMetrics().width(text());    //使用fontMetrics()确定文本在水平方向上所需的空间
  23. if (textWidth < 1)
  24. return;
  25. int x = -offset;
  26. while (x < width()) {                //考虑offset的值,多次绘制文本,填充整个窗口部件的宽度为止
  27. painter.drawText(x, 0, textWidth, height(),
  28. Qt::AlignLeft | Qt::AlignVCenter, text());
  29. x += textWidth;
  30. }
  31. }
  32. void Ticker::showEvent(QShowEvent * /* event */)    //启动定时器
  33. {
  34. myTimerId = startTimer(30);
  35. }
  36. void Ticker::timerEvent(QTimerEvent *event)
  37. {
  38. if (event->timerId() == myTimerId) {
  39. ++offset;
  40. if (offset >= fontMetrics().width(text()))
  41. offset = 0;
  42. scroll(-1, 0);  //把窗口部件的内容向左滚动一个像素
  43. } else {
  44. QWidget::timerEvent(event);
  45. }
  46. }
  47. void Ticker::hideEvent(QHideEvent * /* event */)
  48. {
  49. killTimer(myTimerId);   停止定时器
  50. myTimerId = 0;
  51. }

C++ GUI Qt4学习笔记07的更多相关文章

  1. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

  2. C++ GUI Qt4学习笔记03

    C++ GUI Qt4学习笔记03   qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QM ...

  3. C++ GUI Qt4学习笔记08

    C++ GUI Qt4学习笔记08   qtc++signal图形引擎文档 本章介绍Qt的二维图形引擎,Qt的二维图形引擎是基于QPainter类的.<span style="colo ...

  4. C++ GUI Qt4学习笔记09

    C++ GUI Qt4学习笔记09   qtc++ 本章介绍Qt中的拖放 拖放是一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式.除了剪贴板提供支持外,通常它还提供数据移动和复制的功 ...

  5. C++ GUI Qt4学习笔记05

    C++ GUI Qt4学习笔记05   qtc++正则表达式 QIntValidator           --  只让用户输入整数 QDoubleValidator     --  只让用户输入浮 ...

  6. 【QT】C++ GUI Qt4 学习笔记1

    Find对话框实现 平台 Qt5.3.2 MinGW4.8.2 注意创建时用QDialog finddialog.h #ifndef FINDDIALOG_H #define FINDDIALOG_H ...

  7. 【QT】C++ GUI Qt4 学习笔记2

    Go To Cell 利用QT Desinger做好界面后加入的代码有 gotocelldialog.h #ifndef GOTOCELLDIALOG_H #define GOTOCELLDIALOG ...

  8. 【QT】C++ GUI Qt4 学习笔记3

    菜单界面的实现. 看书上第三章,好长,好多代码.我敲了半天,想看看效果,结果却显示不出来.仔细一看,发现spreadsheet的实现在第四章.郁闷.... 又到官网上下代码,结果居然不能运行.难道是因 ...

  9. 【QT】C++ GUI Qt4 学习笔记4

    感觉这本书的顺序设计的太不合理了,出现的最多的一句话就是后面会讲.按照使用的顺序讲不行吗?搞得代码都运行不了. 我决定先直接跳到73页,子类化QTableWidgetItem这一节.因为前面功能的实现 ...

随机推荐

  1. eclipse 4.32 安装 gradle

    更新网址  http://dist.springsource.com/release/TOOLS/gradle

  2. OpenStack 实现技术分解 (7) 通用库 — oslo_config

    目录 目录 前文列表 扩展阅读 osloconfig argparse cfgpy class Opt class ConfigOpts CONF 对象的单例模式 前文列表 OpenStack 实现技 ...

  3. 自定义标记mark

    前言 pytest可以支持自定义标记,自定义标记可以把一个web项目划分多个模块,然后指定模块名称执行.app自动化的时候,如果想android和ios公用一套代码时,也可以使用标记功能,标明哪些是i ...

  4. UnityEventSystem

    能够处理各种UI事件: IPointerEnterHandler:当指针进入 void OnPointerEnter(PointerEventData eventData); IPointerExit ...

  5. win7自带录像工具怎么打开?win7自带录像工具的使用方法

    http://www.xitongcheng.com/jiaocheng/win7_article_28327.html 制作教程的好帮手 win7自带录像工具怎么打开?win7自带录像工具的使用方法 ...

  6. Slience is the sleep that nourishes wisdom

    cumulative: 积聚的 lag. v. 落后 backfire. n. 事与愿违 segregated. adj. 分隔的 back-and-forth: 来回地 initiative. ad ...

  7. Canvas入门07- 自定义实现虚线的绘制

    预备知识 直线的斜率 一条直线与某平面直角坐标系x轴正半轴方向的夹角的正切值即该直线相对于该坐标系的斜率. 对于一条直线 y = kx +b,k就是直线的斜率. 斜率的计算 对于一条已知的线段,求斜率 ...

  8. JSON.toJSONString时保留null值

    QuoteFieldNames———-输出key时是否使用双引号,默认为true WriteMapNullValue——–是否输出值为null的字段,默认为false WriteNullNumberA ...

  9. linux 正则表达式 使用grep命令

    最常应用正则表达式命令是 awk sed grep [root@MongoDB ~]# cat mike.log I am mike! I like linux. I like play footba ...

  10. 【C语言--数据结构】线性顺序表

    线性表的本质: 1.线性表(List)是零个或者多个数据元素的集合: 2.线性表中的数据元素之间是有顺序的: 3.线性表中的数据元素个数是有限的: 4.线性表中的数据元素的类型必须相同: 定义: 线性 ...