事件(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
- #ifndef TICKER_H
- #define TICKER_H
-
- #include <QWidget>
-
- class Ticker : public QWidget
- {
- Q_OBJECT
- Q_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;
- myTimerId = 0;
- }
-
- void Ticker::setText(const QString &newText)
- {
- myText = newText;
- update();
- updateGeometry();
- }
-
- QSize Ticker::sizeHint() const
- {
- return fontMetrics().size(0, text());
- }
-
- void Ticker::paintEvent(QPaintEvent *
- {
- QPainter painter(this);
-
- int textWidth = fontMetrics().width(text());
- if (textWidth < 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 *
- {
- 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 *
- {
- killTimer(myTimerId); 停止定时器
- myTimerId = 0;
- }