Qt 39 Qt中的事件处理,事件ignore以及事件过滤器

Qt学习之事件过滤器的使用(实现QLineEdit点击效果) 实现Qt中QLineEdit编辑框的点击效果。使用事件过滤器来实现编辑框的点击事件。 阅读详情

学习自唐佐林老师的Qt


在这里插入图片描述

在这里插入图片描述
实验1:事件被组件对象处理后可能传递到其父组件

MyLineEdit.h

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>
class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit MyLineEdit(QWidget *parent = 0);
    bool event(QEvent* e);
    void keyPressEvent(QKeyEvent* e);
signals:
    
public slots:
    
};
#endif // MYLINEEDIT_H

Widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include "MyLineEdit.h"
class Widget : public QWidget
{
    Q_OBJECT
    
    MyLineEdit myLineEdit;
public:
    Widget(QWidget* parent = 0);
    bool event(QEvent* e);
    void keyPressEvent(QKeyEvent* e);
    ~Widget();
};
#endif // WIDGET_H

MyLineEdit.cpp

#include "MyLineEdit.h"
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
MyLineEdit::MyLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
}
bool MyLineEdit::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "MyLineEdit::event";
    }
    return QLineEdit::event(e);
}
void MyLineEdit::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "MyLineEdit::keyPressEvent";
    QLineEdit::keyPressEvent(e);
    //如果需要继续调用父组件的event 就一定要执行 e->ignore()
    // e->ignore();
}

Widget.cpp

#include "Widget.h"
#include <QDebug>
#include <QEvent>
Widget::Widget(QWidget *parent)
    : QWidget(parent), myLineEdit(this)
{
}
bool Widget::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "Widget::event";
    }
    return QWidget::event(e);
}
void Widget::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "Widget::keyPressEvent";
    QWidget::keyPressEvent(e);
}
Widget::~Widget()
{
    
}

main.cpp

#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

如果忽略父组件事件处理,则 // e->ignore()
在这里插入图片描述
如果需要执行父组件 事件处理,则 e->ignore()
在这里插入图片描述结果显示,先调用目标组件事件处理,然后调用父组件事件处理。

在这里插入图片描述
在这里插入图片描述

**加粗样式**
实验2: 事件过滤器使用

MyLineEdit.h

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H
#include <QLineEdit>
class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit MyLineEdit(QWidget *parent = 0);
    bool event(QEvent* e);
    void keyPressEvent(QKeyEvent* e);
signals:
    
public slots:
    
};
#endif // MYLINEEDIT_H

Widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include "MyLineEdit.h"
class Widget : public QWidget
{
    Q_OBJECT
    
    MyLineEdit myLineEdit;
public:
    Widget(QWidget* parent = 0);
    bool event(QEvent* e);
    void keyPressEvent(QKeyEvent* e);
    bool eventFilter(QObject* obj, QEvent* e);
    ~Widget();
};
#endif // WIDGET_H

MyLineEdit.cpp

#include "MyLineEdit.h"
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
MyLineEdit::MyLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
}
bool MyLineEdit::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "MyLineEdit::event";
    }
    return QLineEdit::event(e);
}
void MyLineEdit::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "MyLineEdit::keyPressEvent";
    QLineEdit::keyPressEvent(e);
    // e->ignore();
}

Widget.cpp

#include "Widget.h"
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
Widget::Widget(QWidget *parent)
    : QWidget(parent), myLineEdit(this)
{
    //将Widget对象作为 myLineEdit对象的事件处理器,安装事件处理器
    myLineEdit.installEventFilter(this);
}
bool Widget::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "Widget::event";
    }
    return QWidget::event(e);
}
void Widget::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "Widget::keyPressEvent";
    QWidget::keyPressEvent(e);
}
//事件处理器工作
bool Widget::eventFilter(QObject* obj, QEvent* e)
{
    bool ret = true;
    //判断目标对象 与 事件类型,如果目标对象对象是myLineEdit,并且是按键事件
    if( (obj == &myLineEdit) && (e->type() == QEvent::KeyPress) )
    {
        qDebug() << "Widget::eventFilter";
        QKeyEvent* evt = dynamic_cast<QKeyEvent*>(e);
        //如果是这些按键 则返回 false,表示正常传递到目标对象对象myLineEdit
        //如果不是这些按键,则返回 true,表示事件被过滤,在当前函数处理,不会传递给目标对象对象myLineEdit
        switch(evt->key())
        {
        case Qt::Key_0:
        case Qt::Key_1:
        case Qt::Key_2:
        case Qt::Key_3:
        case Qt::Key_4:
        case Qt::Key_5:
        case Qt::Key_6:
        case Qt::Key_7:
        case Qt::Key_8:
        case Qt::Key_9:
            ret = false;
            break;
        default:
            break;
        }
    }
    else
    {
        ret = QWidget::eventFilter(obj, e);
    }
    return ret;
}
Widget::~Widget()
{
    
}

main.cpp

#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}
【Qt】事件传递及事件过滤器 但如果我们在该部件的类中重写了事件处理函数,忽略(ignore)了这个事件,那么这个事件就会传递给这个部件的父部件(注意父部件和父类不是一个东西:父部件是父对象,qt特有的;比如我写了一个表格窗口,view可以接收到中文输入法事件(inputMethodEvent),但是我希望接收到中文输入法事件时做特殊的处理,就需要获取这个事件。其中,事件过滤器在app→event之间,也就是说,在事件还没有到达事件分发器之前就会被截胡,之后怎么处理就是我们说的算了。忽略事件之后,父部件就可以接收到这个事件了。 阅读详情

相关推荐

QT优化重复按键事件处理

为了提高用户体验,我们可以对重复按键事件进行过滤,只处理一次有效的按键事件。下面是一个详细的示例,展示了如何在QT中实现重复按键事件的过滤。首先,我们需要创建一个QT窗口应用程序,并在窗口中设置一个按钮(QPushButton)来触发按键事件。通过以上步骤,我们成功实现了在QT中对重复按键事件的过滤。在实际应用中,你可以根据自己的需要修改过滤逻辑,以适应不同的按键事件处理场景。为假,则表示该按键是第一次按下,我们将其设置为真,并处理按键事件的逻辑代码。的窗口类,并在构造函数中创建了一个按钮,将其连接到。

PixelLogic的博客 685

Qt中事件(event)的接受(accept)与忽略(ignore)

之前一直对Qt的事件不甚理解,今天结合豆子哥的教程再在Vs2013+Qt 编译环境下进行编程后终于弄懂了,简单地记录一下我认为比较重要的点如下: 1.事件的传播是在组件层次上面的,而不是依靠类继承机制。 注:这句话很关键,当触发一个窗口组件时,如果ignore了,则事件会继续传播到上层组件。如下程序,点击了CustomButton按钮,则会触发CustomWidget和MainWindow这2个上...

qq_32491021的博客 1万+

QT拖放事件之二:四大拖放事件中的ignore()所带来的影响

【代码】QT拖放事件之二:四大拖放事件中的ignore()所带来的影响。

十三阿哥的博客 725

qt事件中的accept()和ignore()函数

在使用Qt编写UI界面时,经常会碰到需要重写 mousePressEvent等之类的函数,这里需要根据不同的情况对事件event进行处理。 总结起来如下: accept:接受事件(不往下传递),意味着这次的事件已经被接受,不会再往下传递,不会传递给父类。 ignore:忽略事件(会继续往下传递),意味着这次事件不被接受,这个事件会一直往下传递。 其他参考 https://blog.csdn.n...

lsky380的博客 2455

STM32开发实战--解决STM32CubeMX生成代码时钟初始化卡死问题

本文详细分析了STM32CubeMX生成代码在时钟初始化阶段卡死的问题,提供了多种解决方案,包括简单修改和稳健的等待机制。通过深入探讨HAL库的时钟初始化陷阱及硬件层面的根本原因,帮助开发者快速定位并解决STM32开发中的常见问题。

weixin_26965807的博客 440

基于一维卷积神经网络对机械振动信号进行分类并加以预测

基于一维卷积神经网络对机械振动信号进行分类并加以预测 *使用一维卷积神经网络训练振动信号进行二分类 2020年7月16日,一学期没等到开学,然而又放假了。 总览优快云中大多数卷积神经网络都是对二维图片进行分类的,而图片也都是常见的猫狗分类,minst手写数字分类。一维卷积神经网络的使用非常少见,有也是IDMB情感分类,和鸢尾花分类的。 作者研究生就读于河北一所双飞,全国排名270多,哈哈哈,不吹不黑。 在网上翻来翻去找不到一篇可以利用的代码去研究我的机械故障诊断,后来在无奈下到某宝搜寻到一段代码,可以利用

qq_45714906的博客 1万+

Qt中QEvent的accept和ignore函数 事件 (以QLabel事件重载为例)

Qt中QEvent的accept和ignore函数QApplication::notify() (用来发送一个事件)QObject::eventFilter() (用来过滤事件,即接收拦截别的对象的事件,并处理)QObject::event() (接收发送给自己这个对象的事件)Qt事件相关函数的两种通信方式:1、通过返回值;2、通过accept和ignore在Qt事件传递和接收相关的函数中,QAp...

吾生也有涯,而知也无涯 1万+

基于紫光展锐平台的音频调用到hal层逻辑

基于紫光展锐平台的音频调用到hal层逻辑 1、数据流程图 AudioPolicyService和AudioFlinger的创建: 这两个服务都在audioserver中启动,文件路径: frameworks/av/media/audioserver/main_audioserver.cpp 从AudioFlinger和AudioPolicyService的创建,到output的打开,以及AudioFlinger开始往底层写入数据的具体流程如下图: #mermaid-svg-kjHL4XWwkQXN6NdA

weixin_55053963的博客 1355

Qt Accept和Ignore讲解

文章目录[隐藏] 前言Qt accept 和 ignore demo 讲解Qt accept 和 ignore demo 实现总结 前言 用了这么久 Qt 了,accept() 和 ignore(), 这两个方法总是分不清,今天通过自己写 demo,目前分清了希望不要忘记 ^__^ 。 accept 和 ignore 使用场景有点类似 js 中事件冒泡即子元素点击了父元素是否需要响应...

https://ligo100.cn 小何博客欢迎访问。 827

VMvare 桥接模式无法联网、没有未桥接的主机网络适配器,无法将网络更改为桥接状态。

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!战项目源码讲义》点击传送门即可获取!**

q16974058的博客 4330

STM32+LoRa模块实战:从环境搭建到数据传输完整指南(附避坑清单)

本文提供STM32与LoRa模块从环境搭建到数据传输的完整实战指南,涵盖硬件连接、开发环境配置、AT指令设置、频段优化及低功耗设计等关键步骤,特别针对常见问题提供解决方案和避坑清单,助力物联网开发者高效实现远距离低功耗通信。

weixin_29168813的博客 289

QT QlineEdit过滤器的简单实用

需求是鼠标点钟lineedit的时候弹出路径选择框,自然而然就想到了过滤器了,但是好久不用给忘了,虽然简单而且网上资源很多,但是还是要做个记录提醒自己好记性不如烂笔头 1、.h文件加入 bool eventFilter(QObject *obj, QEvent *ev); 2、为相应的object安装过滤器 ui->lineEdit_3->installEventFilte...

bhuijnmkotfgv的博客 927

YOLOv11改进策略【卷积层】| CVPR 2024 可变形卷积 v4(DCNv4)无界权重提表达 + 线程合并降冗余,强化模型收敛速度

DCNv4(Deformable Convolution v4)是一种专为广泛视觉应用设计的高效算子,它对DCNv3进行了关键改进,有效解决了DCNv3存在的速度慢和表达能力受限等问题。

Limiiiing的博客 925

Qt事件的接受和忽略

Qt事件的接受和忽略

m0_73443478的博客 841

08 RK3568 MAC TO MAC直连 RTL8367S mdio

本文:采用rk3568 gamc0 通过rgmii直连 交换芯片的mac口 通信方法为mdio。

qq_39451352的博客 3475

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

QT学习--事件重写之accept和ignore

因此,当不需要父窗口触发滚轮事件是,需要在重写的滚轮事件中添加accept(),即仅由当前重写滚轮事件的区域触发滚轮事件。当需要触发父窗口的滚轮事件需要添加ignore(),即将当前重写滚轮事件的区域触发滚轮事件,但是触发父类窗口的滚轮事件。当我们重写一个事件,尤其是滚轮事件时,经常会涉及到,滚轮事件是触发的位置。以下为日历类中重写滚轮事件举例(重写的具体内容需要自己补充)以下为日历类中重写滚轮事件举例(重写的具体内容需要自己补充)

Mr_baiL的博客 473

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

qevent 事件的accept()和ignore()

本章内容也是关于Qt事件。或许这一章不能有一个完整的例子,因为对于事件总是感觉很抽象,还是从底层上理解一下比较好的吧! 前面说到了事件的作用,下面来看看我们如何来接收事件。回忆一下前面的代码,我们在子类中重写了事件函数,以便让这些子类按照我们的需要完成某些功能,就像下面的代码: void MyLabel::mousePressEvent(QMouseEvent * event)

证券指标的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

QT 安装事件过滤器

创建事件过滤器的两个步骤: 1、通过对目标对象调用installEventFilter()来注册监视对象。 2、在监视对象的eventFilter()函数中处理目标对象的事件。 事件过滤器一旦被注册,放发给被监视对象的被监视的事件在它们到达目的地之前就会先发给eventFilter()函数。如果在事件处理函数中没有被处理,它将把事件发送给指定目标 MainWindow::MainWindow(QW...

qq_42153903的博客 737

Qt 事件过滤器eventFilter(QObject* obj, QEvent* e) (**笔记**)

Qt 事件过滤器eventFilter(QObject* obj, QEvent* e) (**)

ken2232的博客 7551

事件和忽略

学到事件和忽略的时候,感觉有点蒙,看到这篇文章的时候眼睛一亮因此推荐给各大博友(代码为博主自己编写,但文章是模仿他人编写,若有侵权请及时联系!) 事件的接收与忽略的示意图如下图:                   依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制。在一个特殊的情形下,我们必须使用accept()和ignore()函数,那就是窗口关闭的事件对于窗口关闭Qcloseevent事件,调用accept()意味着Qt会停止事件的传播,窗...

qq_42138448的博客 283

QT-概念笔记

1. event->ignore();//令父控件接收此事件,如果父控件也重写了该事件则执行父控件被重写的事件 2.如果给一个对象同时安装两个事件过滤器,一个是控件自身重写的过滤器,一个是父窗体重写的过滤器, 那么这个对象先调用自身的过滤器->调用父窗体的过滤器,当自身的过滤器过滤掉某个事件,那么父窗体的过滤器则不会被调用(对于某个事件来说),过滤器就相当于一个起到过滤作用的函数,安装几个则调用几个,由子控件的过滤器逐层向父窗体的过滤器按顺序调用,凡是某个函数中的相关事件被过滤掉了,则此对象的

u011555996的博客 356

【Qt】Qt提供的事件处理系统——处理事件的几种方法:重写事件函数、事件分发、事件过滤等的操作

Qt事件处理——按键事件处理

sinat_41752325的博客 2527

Qt之事件处理

Qt提供5种级别事件处理与事件过滤方法 1. 重新实现特殊的事件处理器 以QLabel为例,QLabel类中可以重写的虚函数有如下11个函数。如果期望的事件在如下10个中,就可以继承QLabel重写如下的函数。 virtual void changeEvent(QEvent *ev) override virtual void contextMenuEvent(QContextMenuEvent *ev) override virtual void focusInEvent(QFocusEvent *

Roads 386

Qt的QEvent::accept()和QEvent::ignore()

QEvent的accept和ignore差别

Spoon的博客 2239

Qt之ignore()和accept()

首先来看一段代码: 1234567891011121314151617181920212223242526272829303132333435//!!! Qt5// ---------- custombutton.h ---------- //class CustomButton : pu

一起摇摆_xianggy的专栏 7798
上一篇: Qt 37 - QMap 与 QHash
下一篇: Qt 40 拖放事件深度剖析
Ma浩然
博客等级 码龄9年 1万+粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值