Qt 事件与事件过滤

作者:丁冬,华清远见嵌入式学院讲师。

Qt 当中事件都被看做为对象,都是继承与一个抽象的类QEvent,这样做的好处是为每一个可能存在的事件来分配一个侦听。当来自外界的事件出发,讲进行时间的处理,我们这个文档就是要讲如何使用事件。

事件是怎样驱动的

当一个事件发生的时候, Qt 将会创建一个对象来提供最接近QEvent 的子类来提供服务。 函数本身无法操控事件的本身, 而只能对于一个发来的时间做出相应, 有两种选项, 一种是接受一种是忽略。 一些事件例如QMouseEvent 或者QKeyEvent 是源于外部的事件, 而QTimerEvent 则是应用程序自己产生的事件。

事件类型

很多事件类型都有特自己特定的类, 例如 QResizeEvent, QPaintEvent, QMouseEvent, QKeyEvent, QCloseEvent , 他们都是QEvent 的子类, 并且添加了一些特定的功能, 例如QResizeEvent 添加了size() oldSize() 使得窗口在改变大小的时候可以做到保存。

一些类提供了特殊的类型, 例如QMouseEvent 提供的是鼠标的点击, 双击, 一动以及其他的一些相关的操作。

每一个Event 都包含了一些类型被定义在QEvent::Type 当中, 这样做的好处是更加方便的在程序运行时的检测类型, 并且在构造子类的同时可以直接作为对象来传递。

事件操控器

最常用的方法是调用虚拟函数, 例如当调用QPainteEvent 的时候她的驱动源泉是QWidget::paintEvent() . 这些虚拟函数提供给当前的不见做重新绘制的操作。

下面的例子是将所有的鼠标事件信息都与QCheckBox 进行关联,

void MyCheckBox::mousePressEvent(QMouseEvent *event)
        {
                if (event->button() == Qt::LeftButton) {
                        // handle left mouse button here
                } else {
                        // pass on other buttons to base class
                        QCheckBox::mousePressEvent(event);
                }
        }

部件事件的关联都是从QEvent 基类来完成的, 用户可以使用QEvent来重写

bool MyWidget::event(QEvent *event)
        {
                if (event->type() == QEvent::KeyPress) {
                        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
                        if (ke->key() == Qt::Key_Tab) {
                                // special tab handling here
                                return true;
                        }
                } else if (event->type() == MyCustomEventType) {
                        MyCustomEvent *myEvent = static_cast<MyCustomEvent *>(event);
                        // custom event handling here
                        return true;
                }

        return QWidget::event(event);
        }

你可能感兴趣的:(Qt 事件与事件过滤)