当前位置: 首页 > article >正文

16. Qt系统相关:事件、定时器

1. Qt事件

1.1 简介

        事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在用户操作时发出,如键盘事件、鼠标事件等,另一些则是由系统本身自动发出,如定时器事件。常见的Qt事件如下:

常见事件描述:

1.2 事件处理

        事件处理一般常用的方法为:重写相关的Event函数。

        在Qt中,几乎所有的Event函数都是虚函数,所以可以重新实现。比如鼠标的进入和离开事件,通过重写enterEvent()和leaveEvent()函数实现。

1.3 鼠标事件

1.3.1 鼠标进入&离开事件

        继承实现鼠标进入、离开事件函数:

virtual void enterEvent(QEnterEvent *event);
    virtual void leaveEvent(QEvent *event);

        例如我们需要获取某个控件的鼠标进入、离开事件,就可以继承对应的控件类,实现enterEvent、leaveEvent接口,实现我们自定义的事件处理操作。

        在ui界面上,右键对应的控件,通过提升操作,将其提升为我们实现的类,即可快速实现界面控件替换为我们实现的控件类。

1.3.2 鼠标点击事件

virtual void mousePressEvent(QMouseEvent *event)

注意:鼠标上左键、右键、鼠标滚轮按下、前进/后退侧键,都能触发mousePressEvent事件

(1)获取鼠标点击时坐标

  • 坐标原点为当前控件左上角:

inline int QMouseEvent::x() const

inline int QMouseEvent::y() const

  • 坐标原点为整个屏幕左上角:

 inline int QMouseEvent::globalX() const

 inline int QMouseEvent::globalY() const

(2)获取触发该事件的按键类型

inline Qt::MouseButton button() const

1.3.3 鼠标释放事件

virtual void mouseReleaseEvent(QMouseEvent *event)

1.3.4 鼠标双击事件

virtual void mouseDoubleClickEvent(QMouseEvent *event)

注意:双击操作也会触发单击事件

1.3.5 鼠标移动事件

virtual void mouseMoveEvent(QMouseEvent *event)

注意:随意的鼠标移动,会触发大量的鼠标移动事件,如果多事件进行捕获、进行一些逻辑操作,可能导致程序卡顿等情况,所以Qt为了保证程序流畅性,默认不会开启鼠标移动事件追踪,也就是不会调用mouseMoveEvent接口。

开启鼠标移动事件追踪:

inline void QWidget::setMouseTracking(bool enable)

1.3.6 鼠标滚轮事件

virtual void QWidget::wheelEvent(QWheelEvent *event)

获取滚轮滚动信息:

 inline QPoint angleDelta() const

获取滚轮滚动长度(正负表示方向):

1.4 键盘事件

        Qt中的按键事件是通过QKeyEvent类来实现的,当键盘上的按键被按下或者释放时,键盘事件便会触发。

注意:只有当控件获取到焦点时,该控件的键盘事件才会被触发。

1.4.1 单个按键

virtual void keyPressEvent(QKeyEvent *event);

1.4.2 组合按键

        Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键⼀起使⽤,以实现⼀些复杂的交互操作。KeyboardModifier 中修改键的具体描述如下:

示例:判断是否按下ctrl+A组合键

1.5 窗口事件

1.5.1 窗口移动事件

 virtual void moveEvent(QMoveEvent *event);

QMoveEvent核心接口:

inline const QPoint &pos() const { return m_pos; }
inline const QPoint &oldPos() const { return m_oldPos;}

1.5.2 窗口大小改变事件

 virtual void resizeEvent(QResizeEvent *event);

QResizeEvent核心接口:

inline const QSize &size() const { return m_size; }
inline const QSize &oldSize()const { return m_oldSize;}

2. Qt定时器

        Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定 时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀个任务。定时器在很多场景下都会 使⽤到,如弹窗⾃动关闭之类的功能等。

Qt中的定时器分为 QTimerEvent QTimer 这2个类。

QTimerEvent类 用来描述⼀个定时器事件。在使⽤时需要通过 startTimer() 函数来开启⼀个定时

器,这个函数需要输⼊⼀个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整型值代表

这个定时器。当定时器溢出时(即定时时间到达)就可以在 timerEvent() 函数中获取该定时器的

编号来进⾏相关操作。

QTimer类 来实现⼀个定时器,它提供了更⾼层次的编程接⼝,如:可以使⽤信号和槽,还可以设置只运⾏⼀次的定时器。

2.1 QTimerEvent

        QTimerEvent继承自QEvent,QObject提供了事件的接收和派发,可以直接实现QObject的

void timerEvent(QTimerEvent *event)

接口,来接收并处理TimerEvent事件。

        QObject中也实现了创建开始定时器和关闭定时器的接口,方便快速实现定时器效果:

int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer);

int startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer);
void killTimer(int id);

注意:一个程序内多个定时器都会触发TimerEven事件,所以需要TimerId来标识某一个定时器,在事件处理接口中,通过QTimerEvent的timerId()接口获取触发本次事件的定时器id。

2.2 QTimer

        QTimer可以让我们更加方便快速的实现定时器效果,并利用信号槽机制来处理timeout事件。

3. 事件分发器

        在Qt中,事件分发器(Event Dispatcher)是一个核心概念,用于处理GUI应用程序中的事件。事件分发器负责将事件从一个对象传递到另一个对象,直到事件被处理或取消。

        每个继承自QObject类 或 QObject本身都可以在本类中重写bool event(QEvent *event)函数,来实现相关事件的捕获和拦截。

3.1 事件分发器工作原理

        在Qt中,我们发生的事件就是传递给了QObject对象,更具体点是传递给了QObject对象的event函数。所有的事件都会进入到这个函数里面,所以我们处理事件就要重写该函数。event函数本身不会处理事件,而是根据事件类型(type值)调用不同的事件处理函数。事件分发器就是工作在应用程序向下分发事件的过程:

        在事件分发的过程中,事件分发器也可以做拦截操作。通过bool event(QEvent *e)函数,其返回值为true表示拦截,不向下分发。

4. 事件过滤器

        在 Qt 中,⼀个对象可能经常要查看或拦截另外⼀个对象的事件,如对话框想要拦截按键事件,不让别的组件接收到,或者修改按键的默认值等。

        通过重写bool event(QEvent *e)函数利用事件分发器的原理,可以实现事件拦截,但是如果组件很多就需要重写很多event函数,非常麻烦,并且很可能导致其他问题。

Qt提供了外⼀种机制来达到这⼀⽬的:事件过滤器。 事件过滤器是在应⽤程序分发到 event事件分发器 之前,再做⼀次更⾼级的拦截。如下图⽰:

 

4.1 事件过滤器使用

(1)安装事件过滤器

安装接口:void installEventFilter(QObject *filterObj);

        控件调用installEventFilter安装事件过滤器后,发送给该控件的所有事件会先发送给它安装的过滤器filterObj,由filterObj中的eventfilter接口处理,如果eventfilter返回true,则事件被过滤,不会再发送给该控件。

(2)重写事件过滤器函数:eventfilter()

virtual bool eventfilter(QObject *watched, QEvent *event);

相关文章:

16. Qt系统相关:事件、定时器

1. Qt事件 1.1 简介 事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候&#…...

云平台搭建

物联网云平台的基本概述 基本概念 随着物联网技术的快速发展,越来越多的设备需要接入网络以实现智能化功能,物联网平台应运而生。 物联网云平台(IoT Cloud Platform)是物联网生态系统中的核心组件,它通过提供一系列…...

数学实验(Matlab语言环境和线性代数实验)

一、Matlab语言环境和线性代数实验 1.Matlab语言环境 Matlab简介 Matlab:Matrix Laboratry 矩阵实验室 Matlab 提供了强大的科学计算、灵活的程序设计流程、高质量的图形可视化与界面设计等功能,被广泛应用于科学计算、控制系统、信息处理等领域的分…...

sherpa:介绍

更多内容:XiaoJ的知识星球 目录 1. sherpa 介绍 1. sherpa 介绍 sherpa是 Next-gen Kaldi 项目的部署框架。 sherpa 支持在各种平台上部署与语音相关的预训练模型,并提供多种语言绑定。 目前,sherpa 拥有以下子项目: k2-fsa/sh…...

图片上传的util和使用

图片上传的util package com.ruoyi.web.controller.common.utils;import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.spri…...

2025年4月个人工作生活总结

本文为 2025年4月工作生活总结。 研发编码 一个项目的临时记录 自2月份领导让我牵头负责一个项目起,在本月算是有较多时间投入——但也是与之前的相比。 月初,清明节前一晚上,因某事务被叫上参加临时紧急远程会议,几方领导都在…...

利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb

题目信息: This new atom bomb early warning system is quite strange… 题目使用 elixir 语言 一开始,我们会访问 /page.html <!DOCTYPE html> <!-- 设定文档语言为英语 --> <html lang"en"> <head><!-- 设定字符编码为UTF-8 --><…...

numpy pandas

视频链接 numpy numpy是基于一个矩阵的运算 矩阵的属性 import numpy as np# 把一个列表转换成矩阵的方法 array np.array([[1,2,3],[3,4,5]])# 打印矩阵 print(array)# 维度 print(number of dim:,array.ndim)# 行数和列数 print(shape:,array.shape)# 总共有多少个元素在…...

Amazon Redshift 使用场景解析与最佳实践

作为 AWS 云上数据仓库服务的核心成员&#xff0c;Amazon Redshift 凭借其高性能、可扩展性与经济性&#xff0c;正在成为越来越多企业实现数据驱动决策的首选方案。本文将解析 Redshift 的典型使用场景&#xff0c;并分享几项实用的落地最佳实践&#xff0c;帮助企业在数据仓库…...

STM32F446 RTC在VDD/VDDA关闭后失振问题的分析与解决

【原创】STM32F446 RTC在VDD/VDDA关闭后失振问题的分析与解决 作者: 思考的味道[你的ID] | weix_42368227 版权声明: 禁止未经授权转载 1. 问题描述 在某低功耗STM32F446项目中&#xff0c;采用以下供电方案&#xff1a; VDD&#xff1a;由DC-DC 3.3V提供&#xff08;主电源…...

SSM框架(Spring + Spring MVC + MyBatis)整合配置的详细步骤

以下是 SSM框架&#xff08;Spring Spring MVC MyBatis&#xff09;整合配置的详细步骤&#xff0c;适用于 Maven 项目。 &#xff08;一&#xff09;、pom.xml中添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"ht…...

Elasticsearch 中的索引模板:如何使用可组合模板

作者&#xff1a;来自 Elastic Kofi Bartlett 探索可组合模板以及如何创建它们。 更多阅读&#xff1a; Elasticsearch&#xff1a;可组合的 Index templates - 7.8 版本之后 想获得 Elastic 认证吗&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; El…...

内存泄漏系列专题分析之七:高通相机CamX--Android通用ION(dmabuf)内存分配和释放原理

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之六:高通camx 内存泄漏测试的未回收问题分析 这一篇我们开始讲:内存泄漏系列专题分析之七:高通相机CamX--Android通用ION(dmabuf)内存分配和释放原理 目录 一、背景 二、…...

【LeetCode 42】接雨水(单调栈、DP、双指针)

题面&#xff1a; 思路&#xff1a; 能接雨水的点&#xff0c;必然是比两边都低&#xff08;小&#xff09;的点。有两种思路&#xff0c;一种是直接计算每个点的最大贡献&#xff08;也就是每个点在纵向上最多能接多少水&#xff09;&#xff0c;另一种就是计算每个点在横向上…...

【JS逆向基础】前端基础-HTML与CSS

1&#xff0c;flask框架 以下是一个使用flask框架写成的serve程序 # noinspection PyUnresolvedReferences #Flash框架的基本内容from flask import Flask app Flask(__name__)app.route(/index) def index():return "hello index"app.route(/login) def login():re…...

什么是HTML、CSS 和 JavaScript?

HTML、CSS 和 JavaScript 是构建网页的三大核心技术&#xff0c;它们分工明确又紧密协作。接下来我将分别介绍三者的定义、功能&#xff0c;并阐述它们如何共同构成网页&#xff0c;最后推荐学习资源。 一、HTML&#xff1a;网页的骨架与内容基础 HTML&#xff08;HyperText …...

手机网页提示ip被拉黑名单什么意思?怎么办

‌当您使用手机浏览网页时&#xff0c;突然看到“您的IP地址已被列入黑名单”的提示&#xff0c;是否感到困惑和不安&#xff1f;这种情况在现代网络生活中并不罕见&#xff0c;但确实会给用户带来诸多不便。本文将详细解释IP被拉黑的含义、常见原因&#xff0c;并提供一系列实…...

CCF编程能力等级认证 一级 第一次课

介绍 CCF 编程能力等级认证&#xff08;GESP&#xff09;为青少年计算机和编程学习者提供学业能力验证的规则和平台&#xff0c;由中国计算机学会发起并主办。 每年考试分四次&#xff0c;时间是每年的3月、6月、9月、12月&#xff0c;以当年每期公布的时间为准。 GESP适用年…...

SpringBoot 讯飞星火AI WebFlux流式接口返回 异步返回 对接AI大模型 人工智能接口返回

介绍 用于构建基于 WebFlux 的响应式 Web 应用程序。集成了 Spring WebFlux 模块&#xff0c;支持响应式编程模型&#xff0c;构建非阻塞、异步的 Web 应用。WebFlux 使用了非阻塞的异步模型&#xff0c;能够更好地处理高并发请求。适合需要实时数据推送的应用场景。 WebClie…...

Python爬虫中time.sleep()与动态加载的配合使用

一、动态加载网页的挑战 动态加载网页是指网页的内容并非一次性加载完成&#xff0c;而是通过JavaScript等技术在用户交互或页面加载过程中逐步加载。这种设计虽然提升了用户体验&#xff0c;但对于爬虫来说&#xff0c;却增加了抓取的难度。传统的爬虫方法&#xff0c;如简单…...

学习Cesium Entities

🌐 Cesium中的Entities系统趣味学习 📊 Entities系统架构流程图 #mermaid-svg-Lkue5O3gYOkEVSbD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Lkue5O3gYOkEVSbD .error-icon{fill:#552222;}#mermaid-svg-Lku…...

如何减少锁竞争并细化锁粒度以提高 Rust 多线程程序的性能?

在并发编程中&#xff0c;锁&#xff08;Lock&#xff09;是一种常用的同步机制&#xff0c;用于保护共享数据免受多个线程同时访问造成的竞态条件&#xff08;Race Condition&#xff09;。然而&#xff0c;不合理的锁使用会导致严重的性能瓶颈&#xff0c;特别是在高并发场景…...

Logback官方文档翻译章节目录

Logback官方文档翻译章节目录 第一章 Logback简介 第二章 Logback的架构&#xff08;一&#xff09; Logback的架构&#xff08;二&#xff09; Logback的架构&#xff08;三&#xff09; 持续更新中…...

AtCoder Beginner Contest 404 A-E 题解

还是ABC好打~比ARC好打多了&#xff08; 题解部分 A - Not Found 给定你一个长度最大25的字符串&#xff0c;任意输出一个未出现过的小写字母 签到题&#xff0c;map或者数组下标查询一下就好 #include<bits/stdc.h>using namespace std;#define int long long #def…...

【mysql】常用命令

一 系统mysql用户密码查询 1、在工程目录如/usr/local/httpd/下的*.php中查找类似有db.inf的文件 以php为例。 2、在代码文件中确认有数据库连接的的功能实现 例如&#xff1a; $dbconf parse_ini_file(/usr/local/httpd/conf/db.inf); $link mysql_connect($dbconf[d…...

macOS Arduino IDE离线安装ESP8266支持包

其实吧&#xff0c;本来用platformio也是可以的&#xff0c;不过有时候用Arduino IDE可能更快一些&#xff0c;因为以前一直是Arduino.app和Arduino IDE.app共存了一段时间&#xff0c;后来下决心删掉Arduino.app并升级到最新的Arduino IDE.app。删除了旧的支持板级支持包之后就…...

网络靶场基础知识

一、网络靶场的核心概念 网络靶场&#xff08;Cyber Range&#xff09;是一种基于虚拟化和仿真技术的网络安全训练与测试平台&#xff0c;通过模拟真实网络环境和业务场景&#xff0c;为攻防演练、漏洞验证、安全测试和人才培养提供安全可控的实验空间。其核心目标是通过“虚实…...

基于Partial Cross Entropy的弱监督语义分割实战指南

一、问题背景:弱监督学习的挑战 在计算机视觉领域,语义分割任务面临最大的挑战之一是**标注成本**。以Cityscapes数据集为例,单张图像的像素级标注需要约90分钟人工操作。这催生了弱监督学习(Weakly Supervised Learning)的研究方向,其中partial cross entropy loss(部…...

【算法基础】选择排序算法 - JAVA

一、算法基础 1.1 什么是选择排序 选择排序是一种简单直观的排序算法&#xff0c;它的工作原理是&#xff1a;首先在未排序序列中找到最小&#xff08;或最大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后再从剩余未排序元素中继续寻找最小&#xf…...

电商平台的流量秘密:代理IP在用户行为分析中的角色

在电商江湖中&#xff0c;流量是氧气&#xff0c;用户行为数据是DNA。当你在电商平台点击商品、加入购物车时&#xff0c;背后有一套精密的系统正在分析你的每个动作。而在这套系统的运作中&#xff0c;代理IP正扮演着"隐形推手"的角色——它既是数据采集的"隐身…...