QT::事件过滤

 

事件处理的方式

1.重新实现对象的特定事件处理函数,例如mousePressEvent、keyPressEvent 、showEvent等,处理完毕后将事件交给父类;

2.重新实现event函数,处理完毕后将事件交给父类;

3.在对象上安装事件过滤器,让其他对象控制此对象的事件行为;

4.给主程序QCoreApplication安装事件过滤器,在调用notify进行事件分发之前,会根据过滤器判断对事件的处理(例如:丢弃);

5.子类化QCoreApplication,重新实现notify事件分发函数;

 

事件过滤器
通过调用过滤器对象的QObject::installEventFilter()函数,为目标对象设置一个事件过滤器,
就可在过滤器对象的QObject::eventFilter()函数中处理发往目标对象的事件。
一个事件过滤器在目标对象收到事件之前处理事件,这使得过滤器对象在需要的时候可以检查并丢弃事件。
可以调用 QObject::removeEventFilter()来移除已经安装的事件过滤器。

 

Qt::postEvent              同步分发事件
Qt::sendEvent              异步分发事件
Qt::QueuedConnection 同步分发消息 Qt::DirectConnection 异步分发消息

 

方法一:
//安装事件过滤器

ui->textEdit->installEventFilter(this);
//过滤事件 bool MainWindow::eventFilter(QObject *obj, QEvent *e) { if(obj == ui->textEdit) { if(e->type() == QEvent::Wheel) { QWheelEvent* w = static_cast<QWheelEvent *>(e); if(w->delta() > 0) ui->textEdit->zoomIn(); else ui->textEdit->zoomOut(); }else return false; } else return QWidget::eventFilter(obj, e); }

 


方法二:自定义 MyQApplication 继承 QApplication 实现 notify 函数
class MyApplication : public QApplication
{
public:

    MyApplication(int argc, char **argv) : QApplication(argc,argv) {}
    virtual bool notify(QObject *, QEvent *);
};

bool MyApplication::notify(QObject *receiver, QEvent *event)
{
    if(event->type() == QMouseEvent::MouseButtonPress)
    {
        qDebug() << "get all mouse press event";
        return true;
    }

    return QApplication::notify(receiver,event);
}

 

posted @ 2021-01-29 00:06  osbreak  阅读(263)  评论(0编辑  收藏  举报