事件(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. hibernate中get和load区别

    在日常开发中,获取数据时必不可少的,这样就要用到get和load方法来实现了.下面简单说一下get和load的区别. 1.返回值不同 使用get方法检索数据时,没有该数据返回值为null. 而使用lo ...

  2. 【工具安装】kali linux 安装教程

    日期:2019-07-14 16:36:21 介绍:使用最新版的 VMware 来安装 kali linux 0x01.下载镜像 首先需要安装 VMware,安装步骤点这里. VMware 安装教程 ...

  3. IntelliJ IDEA 配置 Hadoop 源码阅读环境

    1.下载安装IDEA https://www.jetbrains.com/idea/download/#section=windows 2.下载hadoop源码 https://archive.apa ...

  4. 【ABAP系列】SAP ABAP控制单元格是否可编辑

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP控制单元格是否可 ...

  5. Go语言入门篇-基本流程控制

    一.if语句 二.switch语句 三.for语句 四.select语句

  6. 系统用户与用户组管|chfn、密码管理、身份切换、sudo

    2 系统用户与用户组管理 GID为GroupId,即组ID,用来标识用户组的唯一标识符 UID为UserId,即用户ID,用来标识每个用户的唯一标示符 /etc/passwd /etc/shadow ...

  7. 普通项目——>maven项目——>SSM(一)

    首先应该明白,SSM是什么? SSM指的是Spring+SpringMVC+MyBatis Spring Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体 ...

  8. vue使用笔记二

    es6\es2015特性http://lib.csdn.net/article/reactnative/58021?knId=1405 使用express-generator初始化你的项目目录http ...

  9. MySQL-快速入门(7)索引

    1.什么是索引 索引是对数据库表中一列或者多列的值进行排序的一种结构.索引是在存储引擎中实现的,每种存储引擎中的索引不一定完全相同. MySQL中索引的存储类型有两种:btree和hash.MyISA ...

  10. Java数据结构之双向链表

    管理单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找. 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找 ...