【Qt一骚操作】事件过滤器的eventFilter 你需熟知的返回值bool操作

目录

返回true,拦截事件

返回false,不拦截事件


       

       在Qt中,事件过滤器的eventFilter函数返回值表示该事件是否被事件过滤器拦截,即是否停止事件的传递。返回值是一个布尔类型的值,当返回true时,表示事件已被过滤器拦截,不会传递给被监听的对象进行处理;当返回false时,事件会继续传递给被监听的对象进行处理。通常情况下,我们的事件过滤器函数会根据事件类型对事件进行处理,并根据处理结果决定是否拦截该事件。

事件过滤器返回值的含义及使用场景如下:

  • 返回true,拦截事件

(1)当我们需要对某些事件进行过滤或者不希望这些事件传递到被监听对象中进行处理时,可以在事件过滤器中返回true,这样该事件就会被事件过滤器拦截通常用于拦截,修改,标记事件等操作

例如,返回true可以防止用户在QTextEdit控件中插入一些敏感字词。我们可以在TextEdit的事件过滤器中监听keyPressEvent,若有敏感字词插入,就返回true,这样TextEdit就无法插入敏感字词。

bool TextEditEventFilter::eventFilter(QObject* object, QEvent* event)
{
    if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
        QString text = keyEvent->text();
        if (text.contains("敏感字词")) {
            return true;
        }
    }
    return QObject::eventFilter(object, event);
}
  • 返回false,不拦截事件

(2)当我们希望事件可以被传递到被监听对象中进行处理时,可以在事件过滤器中返回false,这样该事件就会被传递到目标对象中进行处理。

例如,我们可以监听鼠标对QPushButton的单击事件,当按钮被单击时,我们修改按钮的文本,但是不拦截事件,使得按钮的点击信号可以继续传递给连接的槽函数进行处理

bool ButtonEventFilter::eventFilter(QObject* object, QEvent* event)
{
    if (event->type() == QEvent::MouseButtonRelease)
    {
        QPushButton* button = qobject_cast<QPushButton*>(object);
        if (button)
        {
            button->setText("Clicked");
        }
    }
    return false;
}

总之,事件过滤器返回值的含义取决于我们的需求,通常需要根据事件类型进行判断,决定是否拦截该事件。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个 Qt 事件过滤器的示例: ```c++ class EventFilter : public QObject { Q_OBJECT public: explicit EventFilter(QObject *parent = nullptr); protected: bool eventFilter(QObject *watched, QEvent *event) override; }; EventFilter::EventFilter(QObject *parent) : QObject(parent) { // 在要安装事件过滤器的对象上调用 installEventFilter() 函数 qApp->installEventFilter(this); } bool EventFilter::eventFilter(QObject *watched, QEvent *event) { // 在 eventFilter() 函数中实现事件过滤器的逻辑 if (event->type() == QEvent::MouseButtonPress) { // 这里可以获取鼠标点击的位置等信息 QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); qDebug() << "Mouse button pressed at:" << mouseEvent->pos(); // 返回 true 表示事件已经被过滤并处理,不要传递给目标对象 return true; } // 返回 false 表示事件未被过滤,要传递给目标对象 return false; } ``` 在上面的示例中,我们定义了一个 `EventFilter` 类继承自 `QObject`,并重写了 `eventFilter()` 函数来实现事件过滤器的逻辑。在构造函数中,我们调用了 `installEventFilter()` 函数来安装事件过滤器。 当事件发生时,Qt 会先将事件发送给最上层的父对象,然后逐级向下遍历对象树,直到找到能够处理该事件的对象。在每个对象上,如果安装了事件过滤器,那么会先调用事件过滤器的 `eventFilter()` 函数处理事件,并根据返回值决定是否将事件传递给目标对象。 在上面的示例中,我们只处理了鼠标按下事件,并输出了鼠标点击的位置信息。当事件被过滤并处理时,我们要返回 true,告诉 Qt事件已经被处理,不要传递给目标对象。否则,我们要返回 false,让 Qt 继续将事件传递给目标对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monster_H777

我直说吧:你的奖励我的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值