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); //

    [前后对比]

  • 相关阅读:
    img标签中alt属性与title属性在seo的作用-摘自网友
    C# 从补码中获取有符号数的实际数值
    you need to load the kernel first
    桌面远程访问
    供应商通过向日葵访问公司外网办公电脑,通过办公电脑访问内网内生产用电脑
    配置交换机口可以上外网
    抠图和不失真的改变图形大小
    用机房现有双网口电脑添加监控
    服务器配置IP
    在DELL服务器上安装windows2012 r2服务器系统
  • 原文地址:https://www.cnblogs.com/azbane/p/8692237.html
Copyright © 2011-2022 走看看