其他分享
首页 > 其他分享> > qt事件过滤器

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

复制代码

[前后对比]

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