事件(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. 线对 Line pairs、LP(分辨率cy/mm)

    线对 (Line pairs) 是胶片.镜头等电影摄影领域的专用名词. 每毫米线对一般指分辨率的单位,指仪器在一毫米内能分辨出多少对线. 在一定尺度内的可分辨线对数常被用来衡量仪器的空间分辨能力,能分 ...

  2. tomcat打开失败原因

    我重装系统以后,tomcat无法打开,原因是有的项目的虚拟路径有误 到server.xml下修改虚拟路径

  3. 软件-客户端管理工具-SourceTree-帮助:免费Git客户端:sourcetree详细介绍

    ylbtech-软件-客户端管理工具-SourceTree-帮助:免费Git客户端:sourcetree详细介绍 1.返回顶部 1. 一.简介:一个用于Windows和Mac的免费Git客户端.Sou ...

  4. nacos 发布配置

    server 保留 2 份配置文件,一份在 mysql,一份在本地磁盘,同时在内存中缓存配置文件的 md5 值.当客户端获取配置时,server 直接返回本地磁盘文件,使用的是 sendFile ap ...

  5. django项目部署过程

    django项目部署过程 1.上传代码 用git或者其他工具,如scp 代码上传后保证每个应用下的migrations文件夹里只有一个__init__.py文件,自己的迁移文件不要上传上来,具体的gi ...

  6. delphi : 窗体的close,free,destroy

    一.我用application.create(TForm2,Form2)语句,创建了Form2,可是调用了Form2.close后,重新调用Form2.show. 刚才所创建的Form2仍然存在.问为 ...

  7. 模态框——angular

    ui-bootstrap-tpls.js库 $uibModal服务 $uibModalInstance服务 一.在angular中应用modal $uibModal 使用方法:直接注入到控制器中. . ...

  8. 【MM系列】SAP MM模块-控制采购订单中某些项目的输出显示

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-控制采购订单中某些 ...

  9. 《React+Redux前端开发实战》笔记1:不涉及React项目构建的Hello World案例

    本小节实现一个不涉及项目构建的Hello World. [React的第一个Hello World网页] 源码地址:https://jsfiddle.net/allan91/2h1sf0ky/8/ & ...

  10. cdh平台问题

    问题背景:内容的不懂之处,可以私信博主.友好交流使用.主要针对的问题种类有:网络桥接报错.网卡文件问题(该问题主要看你的安装脚本文件里面写的是否和主机对应,也是运行环境的问题).scm表中没有节点信息 ...