事件分发器event,事件过滤器eventFilter

2025-05-04  本文已影响0人  xqiiitan

Day04. 事件。

QApplication类:
while(GetMessage(msg)) {}

窗口:事件分发器 event()

mouseEvent、mousePress、timer、 keyPress

1.event函数。事件分发器

事件分发器作用:过滤事件、虚函数-实现某个功能。
protected:
bool event(QEvent *e);

// .cpp复写方法
bool MyLabel::event(QEvent e)
{
//返回true,代表事件被处理过了,不继续向下分发。
//false,事件没有被处理,会继续向下分发
/
switch(e->type())
{
case QEvent::MouseMove:
mouseMoveEvent(e);
break;
case QEvent::Timer:
timerEvent(e);
break;
}*/
//过滤定时器事件
if(e->type == QEvent::Timer) return true;
return QLabel::event(e); //让父类执行默认的处理
}

2.事件过滤器 eventFilter

事件进入窗口之前被拦截,eventFilter
1.需要过滤窗口的事件,需要给该窗口安装事件过滤器。事件进入不到该窗口。
2.需要在事件过滤器函数中,处理该事件。
在事件进入窗口之前,拦截事件。

函数:bool eventFilter(QObject *obj, QEvent *ev)

//widget.h
class Widget : public QWidget
{
protected:
bool eventFilter(QObject *obj, QEvent *ev);
private:
Ui::Widget *ui;
}

//widget.cpp

Widget::Widget(QWidget *parent) :QWidget,
    ui(new Ui::Widget) 
{
    ui->setupUi(this);
    //给MyLabel安装事件过滤器,参数:谁来过滤label的事件。
    ui->mylabel->installEventFilter(this);
}
bool Widget::eventFilter(QObject *obj, QEvent *ev)
{
    // 判断对象,避免多个label都安装了事件过滤器。
    if(((QLabel*)obj) == ui->mylabel) {
        //过滤事件
        if(e->type() == QEvent::MouseMove) {
            ui->mylabel->setText("++++++++++++");
            return true;
        }
    }
    // 执行默认处理
    return QWidget::eventFilter(obj, e);
}
上一篇 下一篇

猜你喜欢

热点阅读