Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
目录
1.1鼠标进入和离开enterEvent\leaveEvent
1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent
1.3定时器事件timerEvent
1.4定时器类QTimer
1.5事件分发器event
1.6事件过滤器eventFilter
1.1鼠标进入和离开enterEvent\leaveEvent
事件:

鼠标进入函数原型:
[virtual protected] void QWidget::enterEvent(QEvent* event);
鼠标离开函数原型:
[virtual protected] void QWidget::leaveEvent(QEvent* event);
举例:重写鼠标进入离开事件
void MyLable::enterEvent(QEvent *event)
{qDebug()<<"鼠标进入";
}void MyLable::leaveEvent(QEvent *event)
{qDebug()<<"鼠标离开";
}

1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent
鼠标按下、释放是瞬间触发的,移动是一个持续性事件
鼠标按下函数原型:
[virtual protected] void QWidget::mousePressEvent(QMouseEvent* event);
鼠标释放函数原型:
[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent* event);
鼠标移动函数原型:
[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent* event);
举例:
void MyLable::mousePressEvent(QMouseEvent *event)
{qDebug()<<"鼠标按下了";
}void MyLable::mouseReleaseEvent(QMouseEvent *event)
{qDebug()<<"鼠标松开了";
}void MyLable::mouseMoveEvent(QMouseEvent *event)
{qDebug()<<"鼠标移动了";
}

扩展1:鼠标按下,释放,移动时,分别打印鼠标相对于Label的x、y坐标
QMouseEvent可以获取鼠标对应的信息
void MyLable::mousePressEvent(QMouseEvent *event)
{QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());qDebug()<<str;qDebug()<<"鼠标按下了";
}void MyLable::mouseReleaseEvent(QMouseEvent *event)
{QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());qDebug()<<str;qDebug()<<"鼠标松开了";
}void MyLable::mouseMoveEvent(QMouseEvent *event)
{QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());qDebug()<<str;qDebug()<<"鼠标移动了";
}
扩展2:在MyLabel中鼠标只要移动,就会触发移动事件,不需要按下
将鼠标追踪效果设为true
MyLable::MyLable(QWidget *parent): QLabel{parent}
{this->setMouseTracking(true);
}
扩展3:鼠标左键按下时,才会触发相应内容
QMouseEvent对象的button()可以判断鼠标按下的是左键或右键
void MyLable::mousePressEvent(QMouseEvent *event)
{if(Qt::LeftButton==event->button()){QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());qDebug()<<str;qDebug()<<"鼠标按下了";}
}void MyLable::mouseReleaseEvent(QMouseEvent *event)
{if(Qt::LeftButton==event->button()){QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());qDebug()<<str;qDebug()<<"鼠标松开了";}
}void MyLable::mouseMoveEvent(QMouseEvent *event)
{if(Qt::LeftButton==event->button()){QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());qDebug()<<str;qDebug()<<"鼠标移动了";}
}
1.3定时器事件timerEvent

需求:两个label,初始值都为1,第一个每隔一秒加一,第二个每隔一秒加二
class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//重写定时器事件void timerEvent(QTimerEvent *event);//声明两个定时器的唯一标识int id1;int id2;
private:Ui::Widget *ui;
};
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//1000毫秒,每隔一秒钟会触发timerEvent,startTimer会返回一个唯一标识this->id1=startTimer(1000);this->id2=startTimer(2000);
}void Widget::timerEvent(QTimerEvent *event)
{//QTimerEvent的timerId方法可以获得计时器的唯一标识if(event->timerId()==this->id1){static int num1=1;ui->label->setText(QString::number(num++));}if(event->timerId()==this->id2){static int num2=1;ui->label->setText(QString::number(num2++));}
}
startTimer——启动定时器,单位是毫秒,startTimer会返回一个int类型的唯一标识
1.4定时器类QTimer

需求:一个label,初始值为1,每隔0.5秒加一;且有一个停止按钮,点击之后,label上的数字停止递增
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QTimer * timer=new QTimer(this);//每隔500毫秒发timeout的信号timer->start(500);connect(timer,&QTimer::timeout,[=]{static int num3=1;ui->label_3->setText(QString::number(num++));})connect(ui->btn_stop,&QPushButton::clicked,[=]{timer->stop();});
}
注意:
- start——启动定时器,单位毫秒;超过时间会发timeout的信号
- stop——停止计时器
1.5事件分发器event


需求:重写一个事件分发器,拦截鼠标按下事件
class MyLabel : public QLabel
{Q_OBJECT
public:explicit MyLabel(QWidget *parent = nullptr);void mousePressEvent(QMouseEvent *ev);bool event(QEvent *e);
signals:};
void MyLabel::mousePressEvent(QMouseEvent *ev)
{QString str=QString("鼠标按下了x=%1,y=%2").arg(ev->x()).arg(ev->y());qDebug()<<str;
}bool MyLabel::event(QEvent *e)
{if(e->type()==QEvent::MouseButtonPress){QMouseEvent* ev=static_cast<QMouseEvent*>(e);QString str=QString("event事件中鼠标按下了x=%1,y=%2").arg(ev->x()).arg(ev->y());qDebug()<<str;//标识拦截下鼠标按下事件return true;}//其他事件交给父类处理return QLabel::event(e);
}
1.6事件过滤器eventFilter

时间过滤器函数原型:
virtual bool QObject::eventFilter(QObject* watched,QEvent* event);
若此事件是感兴趣的类型,返回true,自己进行处理;若不是,返回false,继续转发

事件过滤器使用步骤:
- 给控件安装过滤器installEventFilter
- 重写过滤器事件eventFilter
//安装事件过滤器ui->label->installEventFilter(this);bool Widget::eventFilter(QObject *watched, QEvent *event){if(watched==ui->label){if(event->type()==QEvent::MouseButtonPress){QMouseEvent* ev=static_cast<QMouseEvent*>(event);QString str=QString("eventFilter事件中鼠标按下了x=%1,y=%2").arg(ev->x()).arg(ev->y());qDebug()<<str;//标识拦截下鼠标按下事件return true;}}//其他事件交给父类处理return QWidget::eventFilter(watched,event);}
相关文章:
Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
目录 1.1鼠标进入和离开enterEvent\leaveEvent 1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent 1.3定时器事件timerEvent 1.4定时器类QTimer 1.5事件分发器event 1.6事件过滤器eventFilter 1.1鼠标进入和离开enterEvent\leaveEvent 事件&#x…...
Javascript高级—深入JS模板字符串的高级用法
深入JS模板字符串的高级用法:解锁动态内容生成的无限可能 在JavaScript编程中,模板字符串(Template Literals)自ES6(ECMAScript 2015)引入以来,就以其简洁、直观的特性迅速成为开发者们生成动态…...
14. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--章节总结
本章重点介绍了如何在一个简单的系统中实现基本的权限管理功能。通过构建一个简单的权限控制模型,章节阐述了如何为用户分配权限,并在应用程序中进行访问控制。 一、关键要点: 1. 用户管理(登录/注册/Token) 本章节聚…...
vulhub之fastjson
fastjson 1.2.24 反序列化 RCE 漏洞(CVE-2017-18349) 漏洞简介 什么是json json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下: {"name":"BossFrank", "age":23, "isDevel…...
2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域
量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力,远远超过了经典计算机的能力。当与人工智能(AI)集成时,量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题,这对优化和…...
卷积神经网络各层介绍
目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU(Rectified Linear Unit) 3.2 sigmoid 3.3 tanh(双曲正切) 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核(滤波器)对矩阵进…...
Python应用指南:高德拥堵延时指数
随着城市化进程的加快,交通拥堵问题日益严重,成为影响城市居民生活质量的重要因素之一。为了科学评估和管理交通拥堵,各种交通拥堵指数应运而生。其中,高德地图提供的“拥堵延时指数”因其数据丰富、实时性强和应用广泛而备受关注…...
ISO 21434标准:汽车网络安全管理的利与弊
ISO 21434标准在提升汽车网络安全性方面起到了重要作用,但任何标准都不是完美无缺的,ISO 21434标准也存在一些不足之处。以下是对其不足之处的分析: 一、标准的灵活性与适应性 缺乏具体技术细节:ISO 21434标准更多地提供了网络安…...
无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)
在数字化时代,流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合,流媒体播放器的核心技术不断演进,为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器,是一款能够同时支持HTTP、…...
excel版数独游戏(已完成)
前段时间一个朋友帮那小孩解数独游戏,让我帮解,我看他用电子表格做,只能显示,不能显示重复,也没有协助解题功能,于是我说帮你做个电子表格版的“解题助手”吧,不能直接解题,但该有的…...
接口上传视频和oss直传视频到阿里云组件
接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…...
Arcgis 地图制作
地图如下,不同历史时期:...
【每日一题1121】python校招笔试题、面试题
1、Python字符串不是通过NUL或者’\0’来结束的 C语言中字符串使用’\0’作为结束符,以防止越界。但是在python中,字符串值只包含所定义的东西。 2、执行以下程序,输出结果为() class Base(object):count 0def __in…...
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
Spring Boot Vue 基于 RSA 的用户身份认证加密机制实现 什么是RSA?安全需求介绍前后端交互流程前端使用 RSA 加密密码安装 jsencrypt库实现敏感信息加密 服务器端生成RSA的公私钥文件Windows环境 生成rsa的公私钥文件Linux环境 生成rsa的公私钥文件 后端代码实现返…...
Docker搭建有UI的私有镜像仓库
Docker搭建有UI的私有镜像仓库 一、使用这个docker-compose.yml文件: version: 3services:registry-ui:image: joxit/docker-registry-ui:2.5.7-debianrestart: alwaysports:- 81:80environment:- SINGLE_REGISTRYtrue- REGISTRY_TITLEAtt Docker Registry UI- DE…...
Qt打开文件对话框选择文件之后弹出两次
项目场景: 在 Qt 中,使用 ui 自动生成的 UI 文件会为每个控件自动生成一些默认的槽函数。如果您手动创建的槽函数名称与这些自动生成的槽函数名称相同,就会导致信号被多次连接,从而引发多次弹出文件对话框的问题。 原因分析&…...
【JAVA】正则表达式中的正向肯定预查
在Java中,正向肯定预查(Positive Lookahead)是一种正则表达式的高级特性,用于在匹配某个模式之前检查某个条件是否满足。正向肯定预查不会消耗字符,也就是说,它不会将匹配的字符从剩余的字符串中移除&#…...
django从入门到实战(一)——路由的编写规则与使用
Django 路由的编写规则与使用 在 Django 中,路由(URLconf)是将 URL 映射到视图函数的机制。它允许我们定义网站的 URL 结构,并将请求分发到相应的处理函数。以下是关于 Django 路由的定义规则及使用的详细介绍。 1. Django 的路…...
vue框架开发的前端项目,build和package的区别
在使用 Vue 框架开发前端项目时,build 和 package 是两个常见的操作,它们有不同的目的和作用。下面是它们的区别: 1. Build(构建) build 是将前端源代码(如 Vue 组件、JavaScript 文件、CSS 样式等&#…...
视频智能分析软件LiteAIServer摄像机实时接入分析平台噪声监测算法介绍
在视频监控领域,噪声问题一直是一个令人头疼的难题。无论是低光环境、摄像机传感器的高灵敏度,还是编码压缩过程中的失真,都可能导致视频中出现噪声,从而影响监控画面的清晰度和准确性。这些噪声不仅降低了视频的可读性࿰…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
