zoukankan      html  css  js  c++  java
  • Qt事件过滤器

         昨天发了blog之后,网友提供一种不用子类化的方式来实现左键双击,就是使用QObject提供的事件过滤器来实现对其他对象的事件进行响应。这里先安装对应对象的事件过滤器,installEventFilter(this),这样只要该对象产生事件,就会先执行本对象的eventFilter()函数,在该函数里先判断是否是我们需要处理的事件,如果是则处理返回true,如果不是则返回false,那么该事件则会传递下去,进行处理。
         这里我初始化了一个:
     1  ui->SendTextEdit->installEventFilter(this);
     2 
     3 bool MainWindow::eventFilter(QObject *target, QEvent *event)
     4 {
     5     if(target == ui->SendTextEdit)
     6     {
     7        
     8         if(event->type()== QEvent::MouseButtonDblClick)
     9         {
    10             ui->ReceiveText->appendPlainText("double click");
    11 
    12             return true;
    13         }
    14     }
    15 
    16     return false;
    17 }

         不过测试发现鼠标的左键双击无效,中间和右键双击都可以,这里纠结了,发现不了什么原因,试了其他的mouse事件也都无法触发左键的事件,只能怀疑是左键事件被什么屏蔽掉了,最后google到了答案,原来QPlainTextEdit类是派生自QAbstractScrollArea类的,而该类将左键的事件是在viewport上的,所以要这样设置:

       
     1 ui->SendTextEdit->viewport()->installEventFilter(this);
     2 
     3 bool MainWindow::eventFilter(QObject *target, QEvent *event)
     4 {
     5     if(target == ui->SendTextEdit->viewport())
     6     {
     7         QMouseEvent *mousevent = (QMouseEvent *)(event);
     8         if(event->type()== QEvent::MouseButtonDblClick && mousevent->buttons() == Qt::LeftButton)
     9         {
    10             ui->ReceiveText->appendPlainText("double click");
    11 
    12             return true;
    13         }
    14     }
    15 
    16     return false;
    17 }
         这样写就可以实现左键双击事件的过滤了,QAbstractScrollArea派生出来的类还有QTextEdit/QTextBrowser,都得用viewport来监测左键事件。
    
    
  • 相关阅读:
    深度学习方面的学术交流平台?
    如何用简单例子讲解 Q
    强化学习之Q-learning简介
    学完了在线课程?如何开启深度学习论文的阅读模式
    Java高级特性之枚举
    uboot启动流程
    Chromium网页Layer Tree创建过程分析
    Sql控制反转小尝试
    模拟日历计算 poj1008
    安卓零碎知识集中
  • 原文地址:https://www.cnblogs.com/nixianmin/p/3105568.html
Copyright © 2011-2022 走看看