1·重载eventFilter函数(创建过滤器)
virtual bool QObject::eventFilter
( QObject * watched, QEvent * event )
2·添加installEventFilter()函数(安装过滤器)
void QObject::installEventFilter
( QObject * filterObj )
目前测试程序有一个textEdit和一个Widget(treeView的parent),1、安装过滤器可以单独写个MEventFilter类,在textEdit或Widget中new一个MEventFilter。
text=new TextEdit(this);
MEventFilter* filter=new MEventFilter;
text->installEventFilter(filter);
2、直接在Widget中重载eventFilter函数
bool Widget::eventFilter(QObject *to, QEvent *event)
在eventFilter函数中如果需要过滤某个事件需要返回true
事件的调用最终都会调用QCoreApplication的notify()函数,因此,最大的控制权实际上是重写QCoreApplication的notify()函数。由此可以看出,Qt的事件处理实际上是分层五个层次:重定义事件处理函数(mousePressEvent),重定义event()函数(重载Qobject的event函数),为单个组件安装事件过滤器(个人认为一般加在此处),为QApplication安装事件过滤器(过滤所有窗口事件),重定义QCoreApplication的notify()函数(可能对效率有影响)。这几个层次的控制权是逐层增大的。
问题::测试发现鼠标左击失效(给单个组件安装事件过滤器),可以尝试给QAppliction对象安装事件过滤器
一旦我们给qApp(每个程序中唯一的QApplication对象)装上过滤器,那么所有的事件在发往任何其他的过滤器时,都要先经过当前这个eventFilter(). 在debug的时候,这个办法就非常有用, 也常常被用来处理失效了的widget的鼠标事件,通常这些事件会被QApplication::notify()丢掉. ( 在QApplication::notify() 中, 是先调用qApp的过滤器, 再对事件进行分析, 以决定是否合并或丢弃)
回顾:最近针对问题尝试给QAppliction安装了事件过滤器,成功了
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MEventFilter* filter=new MEventFilter;
a.installEventFilter(filter);
Widget w;
w.setFixedSize(200,200);
w.show();
return a.exec();
}