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

事件系统之如何处理用户输入和其他事件

概述

在Qt中,事件系统是核心机制之一,它允许开发者以一种灵活且高效的方式处理各种类型的事件,包括用户输入、窗口系统事件、定时器事件等

基本概念

事件(Event):事件是描述应用程序状态变化的对象,例如鼠标点击、键盘输入、窗口大小调整等

事件处理器(Event Handler):事件处理器是用于响应特定事件的函数。在Qt中,事件处理器通常被称为槽(Slots),但也可以使用自定义的事件过滤器

事件循环(Event Loop):Qt应用程序的核心是一个事件循环,负责分发和处理事件

常见事件

用户输入事件

鼠标事件

Qt提供了几种鼠标事件类型,如mousePressEvent、mouseReleaseEvent和mouseMoveEvent,

以下是这些事件的示例:

class MouseWidget : public QWidget {
protected:void mousePressEvent(QMouseEvent *event) override {qDebug() << "Mouse pressed at:" << event->pos();if (event->button() == Qt::LeftButton) {// 左键按下时的操作qDebug() << "Left button pressed";}}void mouseReleaseEvent(QMouseEvent *event) override {qDebug() << "Mouse released at:" << event->pos();if (event->button() == Qt::RightButton) {// 右键释放时的操作qDebug() << "Right button released";}}void mouseMoveEvent(QMouseEvent *event) override {// 鼠标移动时的操作qDebug() << "Mouse moved to:" << event->pos();}void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawText(rect(), Qt::AlignCenter, "Click or move the mouse");}
};

键盘事件

键盘事件可以通过重载keyPressEvent(按下按键)和keyReleaseEvent(释放按键)来处理

class KeyboardWidget : public QWidget {
protected:void keyPressEvent(QKeyEvent *event) override {qDebug() << "Key pressed:" << event->key();switch (event->key()) {case Qt::Key_Up:qDebug() << "Up arrow key pressed";break;case Qt::Key_Down:qDebug() << "Down arrow key pressed";break;default:break;}}void keyReleaseEvent(QKeyEvent *event) override {qDebug() << "Key released:" << event->key();}void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawText(rect(), Qt::AlignCenter, "Press any key");}
};

其他事件

定时器事件

定时器事件可以通过QTimer或重载timerEvent来实现

class TimerWidget : public QWidget {
public:TimerWidget(QWidget *parent = nullptr) : QWidget(parent), timerId(-1) {timerId = startTimer(1000); // 每秒触发一次}protected:void timerEvent(QTimerEvent *event) override {if (event->timerId() == timerId) {qDebug() << "Timer event triggered";update(); // 触发重绘}}void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawText(rect(), Qt::AlignCenter, "Timer is running...");}private:int timerId;
};

窗口事件

窗口事件包括窗口创建、销毁、移动、调整大小等,可以重载相应的事件处理器来处理这些事件

class ResizeWidget : public QWidget {
protected:void resizeEvent(QResizeEvent *event) override {qDebug() << "Window resized to:" << event->size();update(); // 触发重绘}void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawText(rect(), Qt::AlignCenter, QString("Window size: %1x%2").arg(width()).arg(height()));}
};

事件过滤器

除了重载事件处理器,还可以使用事件过滤器来拦截和处理事件,这在需要处理多个对象的事件时非常有用

class EventFilterWidget : public QWidget {
public:EventFilterWidget(QWidget *parent = nullptr) : QWidget(parent) {installEventFilter(this); // 安装事件过滤器}bool eventFilter(QObject *obj, QEvent *event) override {if (event->type() == QEvent::MouseButtonPress) {QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);qDebug() << "Mouse pressed at:" << mouseEvent->pos();return true; // 事件已被处理} else if (event->type() == QEvent::KeyPress) {QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);qDebug() << "Key pressed:" << keyEvent->key();return true; // 事件已被处理}return QWidget::eventFilter(obj, event); // 继续传递事件}void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawText(rect(), Qt::AlignCenter, "Press mouse or key");}
};

总结

通过本文的介绍,我们了解了Qt事件系统的几个重要方面,包括如何处理用户输入事件(如鼠标和键盘事件)、定时器事件以及窗口事件。此外,还展示了如何使用事件过滤器来集中处理多个对象的事件,帮助你更好地设计和开发响应迅速、功能丰富的Qt应用程序。

相关文章:

事件系统之如何处理用户输入和其他事件

概述 在Qt中&#xff0c;事件系统是核心机制之一&#xff0c;它允许开发者以一种灵活且高效的方式处理各种类型的事件&#xff0c;包括用户输入、窗口系统事件、定时器事件等 基本概念 事件&#xff08;Event&#xff09;&#xff1a;事件是描述应用程序状态变化的对象&…...

【项目】nnUnetv2复现

作者提出一种nnUNet(no-new-Net)框架,基于原始的UNet(很小的修改),不去采用哪些新的结构,如相残差连接、dense连接、注意力机制等花里胡哨的东西。相反的,把重心放在:预处理(resampling和normalization)、训练(loss,optimizer设置、数据增广)、推理(patch-based…...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程

智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台&#xff08;Intelligent AI Travel Recommendation Platform&#xff09;是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...

TCP7680端口是什么服务

WAF上看到有好多tcp7680端口的访问信息 于是上网搜索了一下&#xff0c;确认TCP7680端口是Windows系统更新“传递优化”功能的服务端口&#xff0c;个人理解应该是Windows利用这个TCP7680端口&#xff0c;直接从内网已经具备更新包的主机上共享下载该升级包&#xff0c;无需从微…...

恭喜!《哪吒2》明天将荣登世界影坛第六!目前仅差1.81亿元

全球总票房为为20.27亿美元&#xff01;3月8日将荣登世界影坛第六宝座&#xff01; 中国票房 内地票房 中国电影票房、灯塔、猫眼三大数据源加权平均得出《哪吒2》中国内地总票房为144.26亿元人民币。 港澳票房 目前港澳地区没有新的数据显示&#xff0c;按3月6日1905电影网…...

e2studio开发RA4M2(15)----配置RTC时钟及显示时间

e2studio开发RA4M2.15--配置RTC时钟及显示时间 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置SWD调试口设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user…...

Flink深入浅出之04:时间、水印、TableSQL

深入理解Flink的waterMark的机制、Flink Table和SQL开发 3️⃣ 目标 掌握WaterMark的的原理掌握WaterMark的运用掌握Flink Table和SQL开发 4️⃣ 要点 &#x1f4d6; 1. Flink中的Time概念 对于流式数据处理&#xff0c;最大的特点是数据上具有时间的属性特征 Flink根据时…...

MongoDB Compass 使用说明

MongoDB Compass 使用说明 安装工具栏按钮详细介绍Connect(连接)1. New Window&#xff08;新窗口&#xff09;2. Disconnect&#xff08;断开连接&#xff09;3. Import Saved Connections&#xff08;导入保存的连接&#xff09;4. Export Saved Connections&#xff08;导出…...

Halcon 算子 一维码检测识别、项目案例

首先我们要明白码的识别思路 把窗口全部关闭读取新的图片图像预处理创建条码模型设置模型参数搜索模型获取条码结果显示条码结果 图像预处理和条码增强 对比度太低&#xff1a; scale_image&#xff08;或使用外部程序scale_image_range&#xff09;,增强图像的对比度图像模糊…...

信号完整性基础:高速信号的扩频时钟SSC测试

扩频时钟 SSC 是 Spread Spectrum Clock 的英文缩写&#xff0c;目前很多数字电路芯片都支持 SSC 功能&#xff0c;如&#xff1a;PCIE、USB3.0、SATA 等等。那么扩频时钟是用来做什么的呢&#xff1f; SSC背景&#xff1a; 扩频时钟是出于解决电磁干扰&#xff08;EMI&#…...

stm32移植LCD2002驱动

介绍 LCD2002支持20X2个字符串显示&#xff0c;引脚功能和读写时序跟LCD1602都很像 LCD类型&#xff1a;字符点阵 点 阵 数&#xff1a;202 外形尺寸&#xff1a;116.0mm37.0mm&#xff08;长宽&#xff09; 视域尺寸&#xff1a;83.0mm18.6mm 点 距 离&#xff1a;0.05mm…...

RAG技术深度解析:从基础Agent到复杂推理Deep Search的架构实践

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数&#xff0c;旨在平滑图像中的纹理区域&#xff0c;同时保留边缘信息。该技术特别适…...

“此电脑”中删除WPS云盘方法(百度网盘通用)

&#x1f4e3;此方法适用于卸载WPS云盘后&#xff0c;WPS云盘图标依然在此电脑中显示的问题。 原理&#xff1a;通过注册来进行删除 步骤&#xff1a; WIN键R,打开运行窗口&#xff0c;输入regedit命令&#xff0c;来打开【注册表编辑器】&#xff1b; 从左侧&#xff0c;依…...

Agent革命:Manus如何用工作流拆解掀起AI生产力革命

一、现象级产品的诞生背景 2025年3月6日&#xff0c;一款名为Manus的AI产品在技术圈引发地震式传播。其官方测试数据显示&#xff1a;在GAIA基准测试中&#xff0c;基础任务准确率达86.5%&#xff08;接近人类水平&#xff09;&#xff0c;中高级任务完成率突破57%。这标志着A…...

四款GIS工具箱软件解析:满足企业多样化空间数据需求

概述 随着地理信息系统&#xff08;GIS&#xff09;在城市规划、环境监测、资源管理等领域的广泛应用&#xff0c;各种GIS工具箱软件不断涌现&#xff0c;为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件&#xff0c;这些软件各具特色…...

nginx 配置403页面(已亲测)

问题&#xff1a;GET请求访问漏洞url即可看到泄露的内网ip 解决方式&#xff1a; 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置&#xff1a; 编写一个403.html 在nginx的配置文件中&#xff0c;配置location参数&#xff1a; location /api/validationCode…...

After Effects的图钉与关键帧动画

姜 子 博 引言 在数字媒体时代&#xff0c;动态图形和视觉效果在信息传播和表达中扮演着越来越重要的角色。After Effects 作为行业领先的软件&#xff0c;提供了丰富的工具和功能&#xff0c;帮助用户创作出令人惊叹的视觉作品。图钉工具和关键帧动画是 AE 中实现复杂动画效…...

SAP DOI EXCEL宏的使用

OAOR里上传EXCEL模版 屏幕初始化PBO创建DOI EXCEL对象&#xff0c;并填充EXCEL内容 *&---------------------------------------------------------------------* *& Module INIT_DOI_DISPLAY_9100 OUTPUT *&--------------------------------------------…...

新编大学应用英语综合教程3 U校园全套参考答案

获取全套答案&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/abaa0338724e...

高考數學。。。

2024上 具体来说&#xff0c;直线的参数方程可以写为&#xff1a; x1t y−t z1t 二、简答题(本大题共5小题&#xff0c;每小题7分&#xff0c;共35分。) 12.数学学习评价不仅要关注结果评价&#xff0c;也要关注过程评价。简要说明过程评价应关注哪几个方面。…...

STM32 子设备通过CAN发送数据到主设备

采集ADC、GPS经纬坐标、温湿度数据、大气压数据通过CAN方式发送给主设备端&#xff0c;帧ID按照如下定义&#xff1a; 我尼玛一个标准帧ID位数据是11位&#xff0c;扩展帧才是111829位&#xff0c;它说最开头的是四位是真类型&#xff0c;并给我如下解释&#xff1a; 它把帧的定…...

HCIA-IP路由动态-RIP

一、概念 动态路由是指路由器通过运行动态路由协议&#xff08;RIP、OSPF等&#xff09;&#xff0c;自动学习和发现网络中的路由信息。路由器之间通过交换路由协议数据包&#xff0c;互相通告自己所知道的网络信息&#xff0c;从而构建和更新路由表。 二、RIP(路由信息协议)…...

CentOS7离线部署安装docker和docker-compose

CentOS7离线部署安装docker和docker-compose 安装包准备 docker下载地址、docker-compose下载地址 docker和docker-compose版本对应关系 注&#xff1a;本次安装部署选择的版本是 docker&#xff1a;docker-28.0.1.tgzdocker-compose&#xff1a;docker-compose-linux-x86_6…...

Sora与AGI的结合:从多模态模型到智能体推理的演进

全文目录&#xff1a; 开篇语前言前言&#xff1a;AGI的挑战与Sora的突破Sora的多模态学习架构&#xff1a;支撑智能体推理的基础1. **多模态学习的核心&#xff1a;信息融合与交叉理解**2. **智能体推理&#xff1a;从感知到决策** Sora如何推动AGI的发展&#xff1a;自主学习…...

Core Speech Kit(基础语音服务)

文章目录 一、Core Speech Kit简介场景介绍约束与限制二、文本转语音1. 场景介绍2. 约束与限制3. 开发步骤4. 设置播报策略设置数字播报策略插入静音停顿指定汉字发音5. 开发实例三、语音识别约束与限制开发步骤开发实例一、Core Speech Kit简介 Core Speech Kit(基础语音服务…...

VsCode 快捷键备忘

移动光标及选择文本 Ctrl ← / → &#xff1a;以单词为单位移动游标Home / End&#xff1a;光标移到行首/行位Ctrl Home / End&#xff1a;光标移到文件首和文件尾Ctrl Shift \&#xff1a;在匹配的分隔符之间跳转 配对的分隔符 是指分隔代码元素的字符&#xff0c;比如字…...

配置 Thunderbird 以使用 QQ 邮箱

配置 Thunderbird 以使用 QQ 邮箱 本片文章的操作系统为 windws 10 &#xff0c;thunder bird 客户端版本为 128.7.1esr(64位)。注意到其他文章的图片中 thunder bird 的 ui 界面和我这个不一样&#xff0c;导致看起来不太方便&#xff0c;所以这里写一篇博客。不同版本的 thu…...

如何使用MyBatis进行多表查询

前言 在实际开发中&#xff0c;对数据库的操作通常会涉及多张表&#xff0c;MyBatis提供了关联映射&#xff0c;这些关联映射可以很好地处理表与表&#xff0c;对象与对象之间的的关联关系。 一对一查询 步骤&#xff1a; 先确定表的一对一关系确定好实体类&#xff0c;添加关…...

第六课:数据存储三剑客:CSV/JSON/MySQL

在Python的数据存储与处理领域&#xff0c;CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用&#xff0c;无论是简单的数据交换、轻量级的数据存储&#xff0c;还是复杂的关系型数据库管理&#xff0c;都能找到它们的身影。本文将详…...