[Qt] 事件过滤器 [2013-06-17更新]

使用步骤:
1. 调用 installEventFilter() 注册需要管理的对象。
2. 在 eventFilter() 里处理需要管理的对象的事件。

示例(一般用法:把控件注册到MainWindow的事件过滤器中):
MainWindow构造函数中:
ui->centralWidget->installEventFilter(this);
ui->pushButton->installEventFilter(this);
ui->toolButton->installEventFilter(this);

在事件管理器中注册后,发送到centralWidget、pushButton、toolButton的事件将首先发送到eventFilter()。

bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
    obj->objectName();  // 打印目标控件的名称
    e->type();          // 获取事件类型

    // 事件过滤函数返回结果的含义
    return true;    // 如果返回true,则通知Qt该事件已经处理完毕
    or
    return false;   // 如果返回false,Qt会继续将该事件发送给目标控件
    or
    // 如果目标控件或发送的事件不是我们希望处理的,则可用以下方式将事件传递给基类的eventFilter()函数
    return QMainWindow::eventFilter(obj, e);
}

注意:
1. 停止对某个事件响应,则需要返回true。

- Qt中5个级别的事件处理和过滤(从1-5级控制权逐级增大)
1. 重新实现事件函数。比如:mousePressEvent(), keyPress-Event(), paintEvent()。这是最常规的事件处理方法。
2. 重新实现QObject::event()。这一般用在Qt没有提供该事件的处理函数时,也就是我们增加新的事件时。
3. 为单个组件安装事件过滤器
4. 为QApplication安装事件过滤器。这之所以被单独列出来是因为: QApplication 上的事件过滤器将捕获应用程序的所有事件,而且第一个获得该事件。也就是说事件在发送给其它任何一个event filter之前发送给QApplication的event filter。
5. 重新实现QApplication的notify()方法。Qt使用notify()来分发事件。要想在任何事件处理器捕获事件之前捕获事件,唯一的方法就是重新实现QApplication的notify()方法。

- 参考资料
http://blog.csdn.net/xie376450483/article/details/5930564
http://blog.csdn.net/xie376450483/article/details/5821970

------------------------------------------------------------------

- 全局用法(把MainWindow注册到Application的事件过滤器中)

1. 创建QApplication的子类,重写如下方法:
    bool eventFilter(QObject *obj, QEvent *e);
    ! 对于需要处理的事件,可以通过自定义信号与MainWindow中对应的槽函数进行关联

2. 在MainWindow编写相应的槽函数

3. 修改main.cpp,参考代码如下:
int main(int argc, char *argv[])
{
    MApplication a(argc, argv);     // 取代原来的QApplication
    MainWindow w;

    // 关联信号槽
    QApplication::connect(&a, SIGNAL(fileDragInto(QString)),
                          &w, SLOT(slotFileDragInto(QString)));

    w.installEventFilter(&a);       // 安装事件过滤器
    w.setAcceptDrops(true);
    w.show();

    return a.exec();
}

你可能感兴趣的:([Qt] 事件过滤器 [2013-06-17更新])