ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

qt事件过滤器

2019-04-26 21:49:25  阅读:395  来源: 互联网

标签:qt spinBox QEvent textEdit ui 事件 过滤器 event


/*
*事件过滤器不是类,仅仅是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); //

复制代码

[前后对比]

标签:qt,spinBox,QEvent,textEdit,ui,事件,过滤器,event
来源: https://blog.csdn.net/g200407331/article/details/89577259

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有