广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt 事件处理机制的深入理解
  • 606
分享到

Qt 事件处理机制的深入理解

2024-04-02 19:04:59 606人浏览 薄情痞子
摘要

目录1.Qt中事件的来源,谁接收处理。2.事件处理顺序3.事件过滤器4.event方法5.鼠标进入事件6.accept(),ignore()1.Qt中事件的来源,谁接收处理。 Qt中

1.Qt中事件的来源,谁接收处理。

Qt中事件的来源有两个:程序外部和内部,多数情况下来自操作系统,可以通过bool QEvent::spontaneous() const函数来获知,返回true,事件发生在应用程序之外(系统事件),否则返回false。

事件由QObject类来接收,是Qt对象模型的核心,所有需要处理的事件类都必须继承QObject。

2.事件处理顺序

首先QCoreApplication::exec()开启了事件循环,一直到QCoreApplication::exit()被调用才终止,所以说事件循环是伴随着Qt程序的整个运行周期,事件被分发到事件队列中,当队列中有事件时会不停的将事件发送给QObject对象,队列为空时就阻塞,以下为处理顺序。

  • sendEvent:使用notify()函数直接将事件发送给接收者,发送事件时不会删除该事件,通常是在栈上面创建事件,它是同步事件。
  • postEvent:将事件添加到事件队列中,并立即返回;事件必须在堆上分配,因为提交事件队列将获得事件的所有权,并在提交后删除它。在事件发布后访问该事件是不安全的,它是异步事件。

示例:

void Widget::on_pushButton_clicked()
{
    QKeyEvent eventPress(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
    QApplication::sendEvent(ui->label, &eventPress);
}
 
void Widget::on_pushButton_2_clicked()
{
    QKeyEvent *eventPress = new QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
    QApplication::postEvent(ui->label, eventPress);
}

点击上图中按钮会发送QLabel标签的键盘按下tab键事件,我自定义了一个WLabel类继承自QLabel,重写了event方法。

bool WLabel::event(QEvent *e)
{
 
    if(e->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = (QKeyEvent*)e;
        if(keyEvent->key() == Qt::Key_Tab)
        {
            qDebug()<<"press tab key";
            return ture;
        }
    }
 
    return QLabel::event(e);
}

事件会发送到WLabel类的event方法中,会打印出下面的结果。

3.事件过滤器

事件的传送和处理流程的第一站是事件过滤器eventFilter(),某个对象A可以通过给另一个对象B安装事件处理器,实现对对象B事件的监听或者拦截功能。我们可以给A取名监听器,B取名接收器。一个对象可以监听多个对象,一个对象也可以被多个事件监听。事件过滤器返回true则表示事件已经处理完毕,否则传递给下一个监听器或者接收器本身。

void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event);

Qt的事件过滤由以上两个方法实现,首先安装一个事件过滤器,然后重写bool eventFilter(QObject *obj, QEvent *event)。

filterObj表示事件筛选器对象,它接收发送到此QObject对象的所有事件。筛选器可以停止事件,也可以将事件转发给此QObject对象。事件过滤器filterObj通过它的eventFilter()函数接收事件。

eventFilter()有返回值。

  • 如果返回true,表示事件过滤,不会发送到对象本身。
  • 如果返回false,表示事件未过滤,会通过event()方法将事件分发到对象。
  • 返回给基类进行处理,例:return QObject::eventFilter(obj, event)。

Qt 事件过滤器(秒懂)_Mr.codeee的博客-CSDN博客

4.event方法

当经过事件过滤器后,未过滤掉的事件会进入到event方法中,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以在派生类中重写这个event()函数。

例:实现一些鼠标进出的打印,键盘按键一些打印。

bool WLabel::event(QEvent *e)
{
    if(e->type() == QEvent::Enter)
    {
        qDebug()<<"WLabel event :enter";
        return true;
    }
    else if(e->type() == QEvent::Leave)
    {
        qDebug()<<"WLabel event :Leave";
        return true;
    }
    else if(e->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = (QKeyEvent*)e;
        if(keyEvent->key() == Qt::Key_Tab)
        {
            qDebug()<<"press tab key";
            return true;
        }
    }
 
    return QLabel::event(e);
}

上述代码中event如果事件e被识别并处理,则应返回true,否则交给它的基类QLabel来处理。

5.鼠标进入事件

bool WLabel::event(QEvent *e)
{
    if(e->type() == QEvent::Enter)
    {
        qDebug()<<"WLabel event :enter";
    }
    return QLabel::event(e);
}

上述代码,

  • 如果事件返回return QLabel::event(e),会将鼠标进入事件分发到 enterEvent(QEvent *event),会打印下面的语句。
  • 如果打印语句后面 return ture,则不会将事件传递到enterEvent中。
void WLabel::enterEvent(QEvent *event)
{
    qDebug()<<"WLabel enterEvent";
}

6.accept(),ignore()

在我们做UI界面时,经常会重写mousePressEvent,wheelEvent等函数,根据不同情况要对事件event进行特殊处理。

当执行event->accept()时,意味着这次的事件已经被“我”接受啦,只有我使用。

当执行event->ignore()时,意味着这次的事件“我”不要接受他,函数执行完event给我的父窗口,他会需要的。

差别也就是要不要传递给父窗口,accept不传递,ignore传递,注意是父窗口,不是基类。

到此这篇关于Qt 事件处理机制的深入理解的文章就介绍到这了,更多相关Qt 事件处理 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt 事件处理机制的深入理解

本文链接: https://www.lsjlt.com/news/146546.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt 事件处理机制的深入理解
    目录1.Qt中事件的来源,谁接收处理。2.事件处理顺序3.事件过滤器4.event方法5.鼠标进入事件6.accept(),ignore()1.Qt中事件的来源,谁接收处理。 Qt中...
    99+
    2022-11-13
  • 深入理解JavaScript事件机制
    目录如何实现一个事件的发布订阅介绍下事件循环宏任务和微任务的区别如何实现一个事件的发布订阅 可以通过以下步骤实现 JavaScript 中的发布-订阅模式: 创建一个事件管理器对象。...
    99+
    2023-05-17
    JavaScript事件机制 JS事件机制
  • JavaScript事件流:深入理解事件处理和传播机制
    引言 JavaScript中的事件流是一种机制,用于描述和处理事件在DOM树中的传播过程。了解事件流的属性和工作原理对于编写高效的事件处理代码和实现复杂的交互功能至关重要。本文将详细介绍JavaSc...
    99+
    2023-09-14
    javascript 开发语言 ecmascript 原力计划
  • 深入理解Qt信号槽机制
    目录1. 信号和槽概述1.1 信号的本质1.2 槽的本质1.3 信号和槽的关系1. 信号和槽概述 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模...
    99+
    2022-11-12
  • 深入理解异步事件机制
    通过了解异步设计的由来,来深入理解异步事件机制。 代码地址 什么是异步 同步 并发(Concurrency) 线程(Thread) I/O多路复用 异步(Asynchronous) 回调(Callback) 参考文...
    99+
    2023-01-31
    机制 事件
  • 深入理解JavaScript的事件执行机制
    目录前言 浏览器 JS 异步执行的原理 浏览器中的事件循环 执行栈与任务队列 宏任务和微任务 Async/await的运行顺序特点示例 个人分析前言 熟悉事件循环,了解浏览器运行机...
    99+
    2022-11-12
  • Java异常处理机制深入理解
    目录1.初识异常2.异常的基本用法异常处理流程3.为什么要使用异常?异常应只用于异常的情况4. 异常的种类 4.1 受查异常解决方案:4.2非受查异常5.如何使用异常避免不...
    99+
    2022-11-13
  • 深入理解python try异常处理机制
    深入理解python try异常处理机制 #python的try语句有两种风格 #一:种是处理异常(try/except/else) #二:种是无论是否发生异常都将执行最后的代码(try/finally...
    99+
    2022-06-04
    异常 机制 python
  • 深入了解Python的异常处理机制
    目录什么是异常?异常处理try-except 格式一-try...except...格式二-try...except {errorName}...格式三-try...except {...
    99+
    2022-11-12
  • 深入理解 Android事件分发机制源码(基于9.0)
    touch事件最开始从Activity 的 dispatchTouchEvent() 方法开始的 /frameworks/base/core/java/android/app...
    99+
    2022-06-06
    源码 Android
  • 深入理解spring的AOP机制原理
    前言在软件开发中,散布于应用中多处的功能被称为横切关注点,通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。把这些横切关注点和业务逻辑分离出来正是AOP要解决的问题。AOP能够帮我们模块化横切关注点,换言之,横切关注点可以被描述为...
    99+
    2023-05-31
    spring aop sprin
  • 深入了解Javascript的事件循环机制
    目录单线程的Javascript同步 vs 异步 宏任务 vs 微任务定时器To Be Continued单线程的Javascript JavaScript是一种单线程语言,它主要用...
    99+
    2022-11-13
  • 深入剖析MongoDB的事务处理与并发控制机制
    深入剖析MongoDB的事务处理与并发控制机制摘要:MongoDB是一种流行的NoSQL数据库,它以其高性能和可扩展性而闻名。然而,MongoDB最初并不支持事务处理和并发控制,这在某些情况下可能引发数据一致性和完整性的问题。为了解决这些问...
    99+
    2023-11-04
    MongoDB 事务处理 并发控制
  • Android 深入探究自定义view之事件的分发机制与处理详解
    目录题引Activity对事件的分发过程父布局拦截的分发处理过程ACTION_DOWN 事件ACTION_MOVE 事件父布局不拦截时的分发处理过程ACTION_DOWNACTION...
    99+
    2022-11-12
  • node.js中的事件处理机制详解
    EventEmitter类 在Node.js的用于实现各种事件处理的event模块中,定义了一个EventEmitter类。所有可能触发事件的对象都是一个集成了EventEmitter类的子类的实例对象,在...
    99+
    2022-06-04
    详解 机制 事件
  • 深入理解Django的信号机制
    目录Django的信号Django信号的使用自定义信号扩展:查看Django信号的接受者扩展:Django内置信号Django的信号 Django的信号机制不同于Linux的信号机制...
    99+
    2023-02-08
    Django 信号机制
  • 深入了解Node事件循环(EventLoop)机制
    主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。下面本篇文章就来带大家掌握Node.js中的eventloop,希望对大家有所帮助!虽然js可以在浏览器...
    99+
    2023-05-14
    javascript Node.js 面试 前端
  • Android 渲染机制深入理解
    基础知识 CPU: 中央处理器,它集成了运算,缓冲,控制等单元,包括绘图功能.CPU将对象处理为多维图形,纹理(Bitmaps、Drawables等都是一起打包到统一的纹理)。...
    99+
    2022-06-06
    Android
  • Java反射机制深入理解
    Java反射机制深入理解一.概念   反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private,由JVM创建。反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成...
    99+
    2023-05-31
    java 反射机制 ava
  • 深入理解Vue的插件机制与install详细
    前言: 我们在使用Vue的时候,经常会使用并写一些自定义的插件,然后利用Vue.use引入。所以提到写插件,install这个方法是必不可少的。Vue.js 的插件应该暴露一个 `i...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作