Qt事件处理(处理鼠标事件、键盘事件、定时器事件、窗口移动和大小变化事件)

事件处理

事件是应用程序内部或者外部产生的事情或者动作的统称。 在 Qt 中,事件是用一个对象来管理一个事件的。所有的事件对象都继承自抽象类 QEvent 。事件包括鼠标事件、键盘事件等,发出自 Qt 或操作系统本身。

QEvent1

处理事件一般通过重写相关的 Event 函数来实现,Qt 中所有的 Event 函数都是虚函数,都可以进行重写。这通常需要自定义一些控件类来继承 Qt 的控件类(如创建 Label 类继承 QLabel 类),但 ui 界面拖拽出来的控件类型都是 Qt 的内置控件类型(如 QLabel 类),重写不能影响到 ui 的控件。

但 Qt 也提供了解决方法,在 ui 界面对控件右键,选择 提升为… 可以将控件的类型改变成自定义类型(前提是必须继承了相关基类):

QEvent2

1. 处理鼠标事件

注意在重写事件时,包含对应的头文件,事件的函数不包含头文件并不会找不到相关的函数,但其 event 参数一定会找不到它的任何方法。

1.1 enterEvent和leaveEvent

enterEvent 和 leaveEvent 分别表示鼠标进入控件和离开控件的事件。

1.2 mousePressEvent和mouseReleaseEvent

鼠标点击左键、右键、滚轮、侧键等都会触发 mousePressEvent 和 mouseReleaseEvent 。如果想要确定究竟是哪些鼠标按键在触发 mousePressEvent 或 mouseReleaseEvent ,Qt有 Qt::LeftButton 用来表示左键、Qt::RightButton 用来表示右键等,使用代码用来判断什么按键在触发 mousePressEvent:

if(event->button() == Qt::LeftButton)
{qDebug()<<"按下左键";
}
else if(event->button() == Qt::RightButton)
{QDebug()<<"按下右键";
}

1.3 mouseDoubleClickEvent

当鼠标短时间两次点击时,就会触发 mouseDoubleClicked(鼠标双击事件)。但当鼠标双击时,也是会触发两次 mousePressEvent 事件的,所以代码中一定要做好单击和双击的区别判断,否则容易出现单双击同时触发的 Bug。

注意 mouseDoubleClickEvent 和 mouseDoubleClickedEvent 事件都是存在的,不要把这两个搞混了。


#include "label.h"
#include <QMouseEvent>Label::Label(QWidget* parent):QLabel(parent)
{}void Label::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){qDebug()<<"点击鼠标左键";}else if(event->button()==Qt::RightButton){qDebug()<<"点击鼠标右键";}}void Label::mouseDoubleClickEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){qDebug()<<"双击鼠标左键";}else if(event->button()==Qt::RightButton){qDebug()<<"双击鼠标右键";}
}

1.4 mouseMoveEvent

mouseMoveEvent(鼠标追踪事件),由于鼠标只是小幅度移动就会产生大量的 mouseMoveEvent 事件,对程序运行的流畅度有很大影响,Qt 的 widget 默认关闭了鼠标追踪,所以即使重写了 mouseMoveEvent 也不会有效果。要想让鼠标追踪生效,需要使用 this->setMouseTracking(true) ,将鼠标追踪开启。

1.5 wheelEvent

wheelEvent(滚动事件),鼠标每次进行滚轮操作时都会触发这个事件,event 中有一个 delta() 会返回鼠标每次滚轮移动的值,向上为整数,向下为负数。

注意 wheelEvent 的头文件是 #include <QWheelEvent> ,且 event 的类型为 QWheelEvent*

#include "label.h"Label::Label(QWidget* parent):QLabel(parent)
{}void Label::wheelEvent(QWheelEvent *event)
{qDebug()<<event->delta();
}

QEvent3

2. 键盘事件

2.1 keyPressEvent

keyPressEvent(键盘按键事件),当键盘上的按键被按下时就会触发该事件,QShorcut 就是基于该事件来设置快捷键的,实际我们也可以通过改写该事件的虚函数来实现快捷键的效果:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::keyPressEvent(QKeyEvent* event)
{if(event->key()==Qt::Key_A && event->modifiers()==Qt::ControlModifier){qDebug()<<"按下ctrl+A";}
}

注意普通按键是 event->key() ,Ctrl 是 event->modifiers()

3. 定时器事件

3.1 QTimerEvent

QTimerEvent(定时器事件)是与定时器有关的事件, QTimer 类就是通过 QTimerEvent 实现的。每一个定时器都有一个定时器的 ID 标识符,在程序中,可以通过不同的 ID 管理不同的定时器,使用多定时器实现程序的多样化。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimerEvent>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);timerID=this->startTimer(1000);//成员变量}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::timerEvent(QTimerEvent* event)
{if(event->timerId()!=timerID){return;}int value=ui->lcdNumber->intValue();if(value<0){this->killTimer(this->timerID);return;}value-=1;ui->lcdNumber->display(value);
}

4. 窗口移动和大小变化事件

4.1 moveEvent

moveEvent(窗口移动事件),当窗口移动时就会触发该事件,可以通过该事件实时获取窗口此时的位置。

4.2 resizeEvent

resizeEvent(窗口大小变化事件),当窗口大小发生变化时就会触发该事件,可以通过该事件动态调整控件大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…

利用 @eslint/eslintrc 实现 ESLint9的适配

深度解析&#xff1a;利用 eslint/eslintrc 实现 ESLint 的高效配置管理 在前端开发领域&#xff0c;代码质量和一致性是至关重要的。ESLint 作为一款流行的代码检查工具&#xff0c;帮助开发者发现代码中的潜在问题并保持代码风格的一致性。而随着项目的复杂度增加和团队规模…

cfca 申请国密证书流程

之前给某银行开发项目&#xff0c;需要用到cfca国密双证证书&#xff0c;证书类型为企业双证的作为接口加密的密钥。 因为是第一次对接&#xff0c;其中走了不少的弯路&#xff0c;现将申请的流程发布出来做下记录 1、需要找到cfca的相关人员进行测试证书的申请 2、大概1天的…

基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

数字孪生技术如何为制造业开辟新天地?

1. 数字孪生在制造业的崛起背景 1.1 数字孪生的概念演进 “数字孪生”(Digital Twin)一词最早由美国密歇根大学Michael Grieves博士在2002年提出,但当时并未称之为“数字孪生”,而是以“信息镜像模型”描述数字世界与物理世界的映射关系。直到2010年前后,美军、NASA等在…

学一个前端 UI 框架,要学些什么内容?

假如你现在要自学 React/Vue 框架&#xff0c;怎么学&#xff1f; 绝大部分同学可能是这样学的&#xff1a; 直接去看官方文档&#xff0c;或者是找一些视频看一遍&#xff0c;学会这个框架的一些基础语法&#xff0c;特性功能等等参考一些例子上手编写 demo&#xff0c;简单…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 C题 物流网络分拣中心货量预测及人员排班 原题再现&#xff1a; 电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包按照不同流…

鸿蒙Flutter开发故事:不,你不需要鸿蒙化

在华为牵头下&#xff0c;Flutter 鸿蒙化如火如荼进行&#xff0c;当第一次看到一份上百个插件的Excel 列表时&#xff0c;我也感到震惊&#xff0c;排名前 100 的插件赫然在列&#xff0c;这无疑是一次大规模的军团作战。 然后&#xff0c;参战团队鱼龙混杂&#xff0c;难免有…

Unity音频混合器如何暴露参数

音频混合器是Unity推荐管理音效混音的工具&#xff0c;那么如何使用代码对它进行管理呢&#xff1f; 首先我在AudioMixer的Master组中创建了BGM和SFX的分组&#xff0c;你也可以直接用Master没有问题。 这里我以BGM为例&#xff0c;如果要在代码中进行使用就需要将参数暴露出去…

Vue项目与云管平台Nginx部署笔记

Vue项目与云管平台Nginx部署笔记 一、项目架构说明 footAdmin云管前端 Vue2 Webpack 构建&#xff0c;部署路径&#xff1a;/usr/share/nginx/html/footAdmin 使用npm run build生成/dist目录&#xff0c;然后将dist目录下面的所有文件&#xff0c;上传到虚拟机/usr/share/n…

java常用数据转换

1. List与数组互转 ArrayList<String> list new ArrayList<>(); String[] array list.stream().toArray(String[]::new); String[] array1 {"apple", "banana", "orange"}; List<String> list1 Arrays.stre…

JAVA学习--java数组--打印稀疏数组和稀疏数组的还原

1.题目描述 2.代码实现 打印二维数组 public class test04 {public static void main(String args[]){//1.创建一个二维数组11*11&#xff0c;0代表没有棋子&#xff0c;1代表黑&#xff0c;2代表白棋int[][] array1new int[11][11];array1[1][2]1;array1[2][3]2;//输出原…

Java 标准注解(内置注解+元注解)的详细说明及使用场景

以下是 Java 标准注解&#xff08;内置注解&#xff09;的详细说明及使用场景&#xff1a; 1. 核心标准注解 (1) Override 用途&#xff1a;标记一个方法覆盖父类的方法或实现接口的抽象方法。约束&#xff1a; 若方法未正确覆盖/实现&#xff0c;编译器会报错。不能用于字段…

使用Python调用Jenkins Api之获取构建日志使用说明文档

简介 通过 Python 脚本自动化获取 Jenkins 构建日志&#xff0c;可以实现日志分析、错误监控、报告生成等功能。本文档将介绍以下方法&#xff1a; Python-Jenkins 库&#xff1a;官方推荐的 Python 客户端库 日志分页与流式处理&#xff1a;应对大日志文件场景 准备工作 …

Day20-前端Web案例——部门管理

目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…

Android java 设计封装增强型WebView组件

Android java 设计封装增强型WebView组件&#xff08;兼容Android 4.4&#xff09; * 特性&#xff1a; * 1. 全生命周期管理 * 2. 智能硬件加速 * 3. 链式配置API * 4. 安全下载管理 * 5. 全屏视频支持 public class EnhancedWebView extends WebView {private CustomWebChrom…

vue 点击放大,图片预览效果

背景&#xff1a; 在使用vue框架element组件的背景下&#xff0c;我们对图片的展示需要点击放大(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 单张图片放大&#xff0c;el-image图片组件&#xff0c;或者原生的img标签。 多张图片放大&…

HTTP代理的全面解读:什么是HTTP代理?HTTP代理的工作原理

在互联网大潮中&#xff0c;每一个请求和返回数据的背后&#xff0c;都离不开传输协议的支持&#xff0c;而HTTP协议无疑是最熟悉的网络通信基础之一。当我们谈到HTTP代理时&#xff0c;它不仅让浏览网络变得更高效&#xff0c;也为数据采集以及全球性远程任务提供了解决方案。…

学习笔记--基于Sa-Token 实现Java项目单点登录+同端互斥检测

目录 同端互斥登录 单点登录SSO 架构选型 模式二: URL重定向传播 前后端分离 整体流程 准备工作 搭建客户端 搭建认证中心SSO Server 环境配置 开放认证接口 启动类 跨域处理 同端互斥登录 同端互斥登陆 模块 同端互斥登录指&#xff1a;同一类型设备上只允许单地…