zoukankan      html  css  js  c++  java
  • Qt事件过滤器和事件的发送

    事件过滤器

    /*
    *事件过滤器不是类,仅仅是QObject类的两个函数:installEventFilter() 和 eventFilter() 。
    *下面讲个例子:
    * 监视过滤 textEdit的鼠标滚轮事件;监视过滤 spinBox的 空格按键事件。
    *2018.4.2 张洪铭
    */
    
    //widget.h
    public:
       bool eventFilter(QObject *watched, QEvent *event);
    //widget.cpp
    #include <QWheelEvent>
    #include <QKeyEvent>
    
    //...
    //构造函数
    ui->textEdit->installEventFilter(this); //this参数表明由本widget部件来负责对 textEdit 的监视和事件过滤
    ui->spinBox->installEventFilter(this);
    //...
    
    bool Widget::eventFilter(QObject *watched, QEvent *event)
    {
        if( watched == ui->textEdit ){ //第一步:判断是否是被事件过滤器过滤的对象
            if( event->type() == QEvent::Wheel ){ //第二部:判断是否是需要过滤的事件
                QWheelEvent * wheelEvent = static_cast<QWheelEvent*>(event);//第三步:将event强制转换为发生的事件类型
                if(wheelEvent->delta()>0)
                    ui->textEdit->zoomIn();
                else
                    ui->textEdit->zoomOut();
               return true; //!!!如果需要该事件继续被传递和被处理,返回true。这很重要!!!。
            }
            else
                return false;//!!!如果不希望该事件继续被传递和被处理,返回false。这很重要!!!。
        }
    
        else if( watched == ui->spinBox ){
            if(event->type() == QEvent::KeyPress){
                QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
                if(keyEvent->key() == Qt::Key_Space ){//如果是空格键
                    ui->spinBox->setValue(0);
                    return true;
                }
            }
            else
                return false;
        }
        else
            return QWidget::eventFilter(watched,event); //最后:返回默认执行结果!!!。
    
    }

    [对比前后]

    事件发送:

    /*
    *Qt 还提供了 事件发送 的功能,是QCoreApplication类提供的。
    *   bool QCoreApplication::sendEvent(QObject * receiverObj,QEvent * event);
    *   bool QCoreApplication::postEvent(QObject * receiverObj,QEvent * event,int priority = Qt::NorMalEventPriority);
    *区别:
    *   sendEvent()立即处理事件;postEvent()把事件放到等待调度队列中。
    *   sendEvent()中的QEvent参数对象在事件发送后,自动删除,所以需要在栈上创建QEvent;
    *   postEvent()中的QEvent参数对象必须new创建,事件发送后,由队列自动删除。
    *
    * 下面提供一个例子:构造函数添加代码,实现想spinBox发送一个向上按钮触发事件。
    */
        QKeyEvent myEvent(QEvent::KeyPress,Qt::Key_Up,Qt::NoModifier);//第三个参数:没有任何修饰键按下
        QApplication::sendEvent(ui->spinBox,&myEvent); //

    [前后对比]

  • 相关阅读:
    全面分析 Spring 的编程式事务管理及声明式事务管理
    100句唤醒自己的励志名言
    100句自我激励的名言佳句
    java反射详解
    JAVA中的反射机制
    【BZOJ1015】【JSOI2008】星球大战Starwar(离线并差集)
    【HEOI2016/TJOI2016】排序(二份答案+线段树)
    【USACO06DEC】—牛奶模式Milk Patterns(后缀自动机)
    【HNOI2016】—找相同字符(后缀自动机)
    【AHOI2013】—差异(后缀自动机)
  • 原文地址:https://www.cnblogs.com/azbane/p/8692237.html
Copyright © 2011-2022 走看看