Qt的事件处理机制分析

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码) 本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。 阅读详情

转自:http://blog.youkuaiyun.com/digu/article/details/1801074


如果对MFC有点了解,可以近似的把Qt的信号(signal)和事件(event)对应于MFC的命令(command)和消息(message) ,事件是窗口系统或者qt对不同情况的响应,绝大多数被产生的事件都是对用户行为的响应,但是也有一些,比如定时器事件,它们是被系统独立产生的。QWidget::event()虚函数是各种事件的一个大管家,负责把大多数常用类型的事件传递给特定的事件处理器(事件处理函数,也都是虚拟函数,便于其继承子类对于该事件处理的编程),可以分析一下事件总管QWidget::event()虚函数的部分源码(完整源码在C:/Qt/4.2.2/src/gui/kernel/qwidget.cpp中qwidget::event()函数的定义):
QEvent类实现对事件的封装。The QEvent class is the base class of all event classes. Event objects contain event parameters. 

bool QWidget::event(QEvent *event)
{
    Q_D(QWidget);

    // ignore mouse events when disabled
    if (!isEnabled()) {
        switch(event->type()) {
        case QEvent::TabletPress:
        case QEvent::TabletRelease:
        case QEvent::TabletMove:
        case QEvent::MouseButtonPress:
        case QEvent::MouseButtonRelease:
        case QEvent::MouseButtonDblClick:
        case QEvent::MouseMove:
        case QEvent::ContextMenu:
#ifndef QT_NO_WHEELEVENT
        case QEvent::Wheel:
#endif
            return false;
        default:
            break;
        }
    }
    switch (event->type()) {            //判断事件类型
    case QEvent::MouseMove:
        mouseMoveEvent((QMouseEvent*)event);           //将鼠标移动类型的事件分派给mouseMoveEvent函数处理
        break;

    case QEvent::MouseButtonPress:
    // Don't reset input context here. Whether reset or not is
    // a responsibility of input method. reset() will be
    // called by mouseHandler() of input method if necessary
    // via mousePressEvent() of text widgets.
#if 0
        resetInputContext();
#endif
        mousePressEvent((QMouseEvent*)event);
        break;

    case QEvent::MouseButtonRelease:
        mouseReleaseEvent((QMouseEvent*)event);
        break;

    case QEvent::MouseButtonDblClick:
        mouseDoubleClickEvent((QMouseEvent*)event);
        break;
#ifndef QT_NO_WHEELEVENT
    case QEvent::Wheel:
        wheelEvent((QWheelEvent*)event);
        break;
#endif
……
……
然后在需要处理该事件的QWidget派生类中重写响应的事件处理函数(覆盖默认的虚函数,如event,keyPressEvent等函数)来完成在该派生类对象中对该事件的响应。

关于对事件过滤器的编程,一般分两步:
1、通过对目标对象(被监视对象)调用installEventFilter()函数来注册监视对象;
2、在监视对象的eventFilter函数中处理目标对象的事件。(可以认为监视对象拦截了目标对象的事件)

下面用代码来说明事件处理处理和事件过滤:

//newlineedit.h
#ifndef NEWLINEEDIT_H
#define NEWLINEEDIT_H

#include <QLineEdit>
#include "ui_newlineedit.h"

class newLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    newLineEdit(QWidget *parent = 0);
    ~newLineEdit();

    bool event(QEvent *event);      //重写event虚函数来处理特定的事件

private:
    Ui::newLineEditClass ui;
};

#endif // NEWLINEEDIT_H

//www.h
#ifndef WWW_H
#define WWW_H

#include <QtGui/QMainWindow>
#include "ui_www.h"

class www : public QMainWindow
{
    Q_OBJECT

public:
    www(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~www();

    bool eventFilter(QObject *target, QEvent *event);      //重写eventFilter虚函数来拦截特定的事件

private:
    Ui::wwwClass ui;
};

#endif // WWW_H


//newlineedit.cpp
#include "newlineedit.h"
#include <QKeyEvent>

newLineEdit::newLineEdit(QWidget *parent)
    : QLineEdit(parent)
{
    ui.setupUi(this);
}
bool newLineEdit::event(QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = (QKeyEvent *)event;   
        if (keyEvent->key() == Qt::Key_Tab)      //判断特定的事件,作出自定义的处理
        {
            insert("/t");
            return true;
        }
    }
    return QWidget::event(event);      //将不需要特定处理的事件交给默认的基类event()函数处理
}
newLineEdit::~newLineEdit()
{

}


//www.cpp
#include "www.h"
#include <QKeyEvent>

www::www(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    ui.lineEdit->installEventFilter(this);       //注册this监视ui.lineEdit对象,this拦截ui.lineEdit的某些事件

bool www::eventFilter(QObject *target, QEvent *event)
{
    if (target == ui.lineEdit && event->type() == QEvent::KeyPress 
        && ((QKeyEvent *)event)->key() == Qt::Key_Tab)     //判断监视拦截条件是否满足,如是,则拦截该事件
    {
        ui.lineEdit->insert(tr("filter completed!"));
        return true;
    }
    return QMainWindow::eventFilter(target, event);
}

www::~www()
{

}

然后我们再来分析一下QObject::installEventFilter函数的源码,看其是如何实现过滤功能的:
void QObject::installEventFilter(QObject *obj)
{
    Q_D(QObject);
    if (!obj)
        return;

    QWriteLocker locker(QObjectPrivate::readWriteLock());

    // clean up unused items in the list
    d->eventFilters.removeAll((QObject*)0);
    d->eventFilters.removeAll(obj);
    d->eventFilters.prepend(obj);
}
可以参考下一篇分析QObject的文章.

【Zephyr 系列 29】低功耗调试指南:电流测量、系统睡眠与功耗分析 Zephyr低功耗调试指南(150字摘要) 针对物联网设备续航需求,本文解析Zephyr低功耗调试方法:1️⃣ 机制:启用PM子系统和tickless idle,配置睡眠策略;2️⃣ 测量:推荐功耗分析仪捕捉μA级电流波动;3️⃣ 优化:管理唤醒源(如GPIO/RTC)、调整BLE广播/连接参数,挂起闲置外设;4️⃣ 分析:建立功耗文档,对比不同模式电流(如待机0.6mA vs广播3.2mA)。强调低功耗需系统性设计,初期即需纳入测试流程。下期将探讨Zephyr OTA升级实现。 阅读详情

相关推荐

【LabVIEW懒人系列教程-视觉入门】2.6LabVIEW模板匹配之创建模板

上期2.5在Labview软件框架中实现了模板匹配功能的运用,然而我们的模板图像是通过视觉助手创建出来的,在实际项目中这样做 ,难免有些不妥。所以,今天就给大家讲解一下,如何编写创建模板功能,模板图像的创建与加载需要注意一些什么。 模板图片的创建,大家可以理解为将图像中的一个特征区域扣下来,通过Labview函数进行信息学习,然后保存成带有图像信息的模板图。 具体做法,下面为大家演示一下 百度网盘视频链接:https://pan.baidu.com/s/1-zxcJBxPgk4t1Ej..

视觉龙哥 2167

Qt中的事件处理

图形界面应用程序的消息处理模型 操作系统发送的消息如何转变为 Qt 信号? Qt 平台将系统产生的消息转换为 Qt 事件 Qt 事件是一个 QEvent 对象 Qt 事件用于描述程序内部或外部发生的动作 任意的 QObject 对象都具有事件处理的能力 GUI 应用程序的事件处理方式 1. Qt 事件产生后立即分发到 QWidget 对象 2. QWidget 中的 event(QEvent*) 进行事件处理 3. event() 根据事件的类型调用不同的事件处理函数

qq_52484093的博客 3550

精益六西格玛Python数字化应用开发-Day18 应用场景:家电企业生产效率优化

本文将重点介绍专门针对精益六西格玛黑带使用场景的 Python 库,这些库功能侧重于数据分析和流程优化,特别适用于 DMAIC 方法论和看板管理。考虑到读者具备中高级Python 使用经验,我们将深入探讨各库的高级功能和实际应用应用场景。 某家电企业生产线自动化程度高,数据量巨大,希望通过精益管理提升生产效率。企业借助 Python 脚本,打通各类数据源(MES、ERP、设备日志),自动归集生产数据,分析各工序的生产节拍、设备停机、效率损失,快速定位瓶颈环节

m0_56592100的博客 905

QT从入门到实战x篇_25_event事件分发器(用于事件的分发;也可以做拦截操作,不建议;bool event(QEvent* e);返回值如果是true代表用户处理这个事件,不向下分发了)

本篇将会介绍QT事件内部的机制

分享学习成长历程,Winter is coming! 568

Code Composer Studio 8.3.1安装与常见问题解决指南

本文提供了Code Composer Studio 8.3.1版本的详细安装指南与常见问题解决方案。内容涵盖从下载离线安装包、系统环境准备、自定义安装步骤,到首次启动配置及汉化建议。重点解析了安装过程中可能遇到的闪退、卡顿、Java虚拟机错误等典型问题的排查与修复方法,旨在帮助开发者高效部署这一稳定的嵌入式集成开发环境。

weixin_29195217的博客 327

优化翼型形状的遗传算法实现

在每一代种群中,通过计算每个个体的适应度值,选择具有较高适应度值的个体,并使用交叉和变异算子对它们进行操作,从而生成新的个体。具体而言,我们将采用一个参数化的翼型模型,其中包括几何设计变量,如角度、弯曲和厚度等,以及性能指标,如升阻比和扭矩等。总之,本文提供了一个基于遗传算法的优化方法,用于寻找最优的翼型形状,并提供MATLAB源代码。需要注意的是,上述代码中的objFunc函数是一个示例性质的目标函数,实际应用中需要根据具体的问题进行修改。1.初始化一个随机的种群,其中每个个体代表一个参数化的翼型模型。

与其临渊羡鱼,不如退而结网 516

QT---消息机制和事件(3)

无

shengruidv的博客 133

STM32 使用IQmath实现SVPWM

文章目录SVPWMIQMATHIQmathLib测试部分程序附件 SVPWM SVPWM是空间矢量脉宽调制(Space Vector Pulse Width Modulation)的简称,通常由三相逆变器的六个功率开关管组成,经过特定的时序和换相所所产生的脉冲宽度调制波,最终输出的波形可能会十分接近理想的正弦波形。 具体如下图所示;左侧为复平面,即空间矢量,右侧为时域的正弦波形; 关于SVPWM原理的文章非常多,这里可以推荐一下网上一个非常不错的教程《SVPWM的原理及法则推导和控制算法详解第五修改版》,

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 2万+

Qt event事件

event主要是做事件分发 bool event(QEvent* e) 返回值如果是true代表已被处理,返回false系统默认处理,最好抛给父类处理

jadeshu的博客 860

PS射击游戏射线检测优化:原理、工程与全链路高性能实现

射线池:减少GC,提升批量检测效率。分层检测:先粗后细,远距离射击高效判定。批量检测:并行处理,适合大量射线场景。空间结构:进一步加速大场景检测。下面继续深入射线检测优化,补充更多实用细节和进阶技巧,包括空间分区加速、射线检测多线程/异步化、射线合并与分帧、射线池通用模板、常见性能陷阱与调优建议等。对于极端性能需求,可自定义轻量级物理系统,仅检测关键对象(如玩家、子弹),跳过复杂物理引擎。结合AABB、OBB、球体等简单碰撞体,射线-包围体检测极快。空间分区+分层检测是大场景射线优化核心。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 434

虚幻商城 蓝图汇总

虚幻引擎是一个非常强大和灵活的游戏开发工具,拥有众多的蓝图可以帮助我们更高效地工作。

一碗清深的博客 1506

一列Qt事件处理机制分析不到位导致的Bug

一、Qt事件处理机制的知识总结 (1-1)五种Qt事件使用方法总结 方法一:重新实现部件的 paintEvent()、mousePressEvent() 等事件处理函数。这是最常用的一种方法(只能用来处理特定部件的特定事件) 方法二:重新实现 notify() 函数。这个函数功能强大,提供了完全的控制,可以在事件过滤器得到事件之前就获得它们。(一次只能处理一个事件) 方法三:向 QApplication 对象上安装事件过滤器。因为一个程序只有一个 QApplication 对象,所以这样实现的功

iriczhao的博客 478

TMC2240 芯片数据手册解读|第三篇 TMC2240 芯片引脚配置与说明

本文详细解析了TMC2240芯片的两款封装(TQFN32和TSSOP38-EP)的引脚分布、电气属性及硬件设计要点。内容涵盖:1)芯片内部功能架构,包括供电、运动控制等五大链路;2)两款封装的核心规范与适用场景;3)七大引脚分类详解(电源、控制、编码器等)及接线要求;4)PCB设计避坑指南,强调电源分割、电荷泵布局等关键点。文章提供完整的原理图绘制和硬件调试指导,适合不同基础的工程师参考实践。

BackCatK Chen的博客 1089

深入分析QT中的事件处理(上--QT中事件处理的机制)

QT中的事件处理是QT学习过程中的一块非常重要知识点,我准备用2篇博客来深入分析一下QT中的事件处理,这篇博客是第一篇博客。 GUI应用程序的特点:1.GUI应用程序必须基于操作系统才能运行,脱离了操作系统GUI应用程序是运行不了的。2.GUI应用程序所提供的功能必须由用户触发。这个是GUI应用程序的特点。 GUI应用程序的运行模型(GUI应用程序的消息处理模型(原理)): ...

weixin_42136255的博客 857

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

qt按键事件处理机制分析

本为以qt2.3.12作为源码进行分析。 下面是一个简单的显示一个按键,并将按键链接到退出操作的程序,本文将一步一步分析,qt是如何实现此操作的。 #include #include #include int main(int argc,char *argv[]) { QPEApplication a(argc,argv); QPushButton *button=new QPush

1020

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Qt事件处理机制(系统消息)

Qt事件处理机制(系统消息)你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ct

weixin_43754520的博客 2213

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Qt事件处理机制

Qt事件处理机制 研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多。后来由于项目的需要,也没有再接触Qt了。现在要重新拾起来,于是要从基础学起。 Now,开始学习Qt事件处理机制。 先给出原文的链接:Qt 事件处理机制 因为这篇文章写...

dichuangheng8094的博客 229

Qt高级——Qt信号槽机制源码解析

Qt高级——Qt信号槽机制源码解析 转发,写得非常好,赞!! https://blog.51cto.com/9291927/2070398

coldplay19921221的博客 221

QT中事件处理(下--Qt中事件处理的具体方法)

在上一篇博客中,我们深入分析了QT中事件处理的相关机制,在这篇博客中我们将来深入分析一下QT中事件处理的具体方法。 首先,我们来回顾一下,事件的传递过程是怎么样的? QT中事件的传递的具体过程 分析一下上述流程图可以总结为下面的流程过程: 1.用户操作相关的GUI应用程序,首先由操作系统感受到用户的操作,然后操作系统会把用户的操作翻译成一条系统消...

weixin_42136255的博客 455

Qt 事件处理机制

public:// 自定义数据成员...// 发送事件// 处理事件...Qt 事件处理系统的关键点:基于QEvent类层次结构表示所有事件通过和QEventLoop管理事件循环平台特定的事件分发器抽象灵活的事件过滤机制支持同步发送和异步投递两种事件传递方式每个线程可以有独立的事件循环提供完善的自定义事件支持这种设计使 Qt 能够高效处理各种类型的事件,同时保持跨平台的一致性和灵活性。

weixin_43050542的博客 432

QT开发——QT事件处理机制

ref:https://blog.youkuaiyun.com/A642960662/article/details/66473871 一、QT事件简介     QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发。QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。     常见的QT事件类型如下:     键盘事件: 按键按下和松开     鼠标事件: 鼠标移动,鼠标按键的...

JIN JI 2013.12.24 468

Qt--Qt中的事件处理

一.Qt事件处理 A.图形界面应用程序的消息处理模型B.Qt平台将系统产生的消息转换为Qt事件1.Qt事件是一个QEvent的对象2.Qt事件用于描述程序内部或外部发生的动作3.任意的QObject对象都具备事件处理的能力C.GUI应用程序的事件处理方式1.Qt事件产生后立即被分到QWidget对象2.QWidget中的event(QEvent)进行事件处理3.event()根据事件类型调用不同的...

cangnuan2978的博客 175

QT事件处理机制

QT开发(十二)——QT事件处理机制 一、QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发。QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。 常见的QT事件类型如下: 键盘事件: 按键按下和松开 鼠标事件: 鼠标移动,鼠标按键的按下和松开 拖放事件: 用鼠标进行拖放 滚轮事件: 鼠标滚轮滚动 绘屏事件: 重绘屏幕的某些部分 定时事件: 定时器到时 焦点事件: 键盘焦点移动 ...

蚂蚁寻路 1041

【QT】QObject三大核心功能——事件处理

【QT】QObject三大核心功能——事件处理 QObject三大核心功能:信号与槽,内存管理,事件处理 总览 谁来产生事件: 最容易想到的是我们的输入设备,比如键盘、鼠标产生的keyPressEvent,keyReleaseEvent,mousePressEvent,mouseReleaseEvent事件(他们被封装成QMouseEvent和QKeyEvent),这些事件来自于底层的操作系统,它们以异步的形式通知Qt事件处理系统,后文会仔细道来。当然Qt自己也会产生很多事件,比如**QObject::

qq_43331089的博客 2571
上一篇: QT添加openssl的方法
下一篇: Qt源码分析之QObject
「已注销」
博客等级 码龄14年 116粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值