使用步骤:
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.youkuaiyun.com/xie376450483/article/details/5930564
------------------------------------------------------------------
- 全局用法(把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();
}
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.youkuaiyun.com/xie376450483/article/details/5930564
------------------------------------------------------------------
- 全局用法(把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();
}