Qt 事件过滤器

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();
}
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值