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

Qt入门7——Qt事件

目录

1. Qt事件介绍:

2. 事件的处理 

示例1:鼠标进入(enterEvent)与离开事件(leaveEvent)

示例2:鼠标点击事件(mousePressEvent)

示例3:鼠标移动事件(mouseMoveEvent)

3. 按键事件

4. 定时器

5. 窗口事件


1. Qt事件介绍:

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

2. 事件的处理 

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

示例1:鼠标进入(enterEvent)与离开事件(leaveEvent)

处理鼠标进入与离开事件

1.新建Qt项目,基类选择QWidget,同时勾选UI界面文件

2. 在ui文件添加label控件

 3. 创建QLabel的子类,重写enterEvent和leaveEvent

①:

②:

此时项目多出两个新文件:

4. 为了方便给label指定父对象,调整一下构造函数:

5.函数重写:在"label.h"中:

(注意:重写函数时,要确保函数名字和参数列表完全一致 ,谨防拼写错误,为避免错误,可以在帮助文档查找目标函数,复制粘贴即可)

class Label : public QLabel
{Q_OBJECT
public:Label(QWidget* parent);void enterEvent(QEvent *event);void leaveEvent(QEvent *event);
};

6. 在"label.cpp"重写enterEvent与leaveEvent方法:

(按alt+回车键转到函数定义)

void Label::enterEvent(QEvent *event)
{(void) event;//躲避编译器警告qDebug() << "enterEvent";
}void Label::leaveEvent(QEvent *event)
{(void) event;//躲避编译器警告qDebug() << "leaveEvent";
}

此时执行程序,其实并没有起到效果,这是因为此时界面上的label并不是我们定义的Label类的实例,其仍然是系统的QLabel创建的实例。

那么问题来了,此时也只能从界面上拖动QLabel来创建实例呀!如何才能使界面上的label是来自我们自己定义的Label类呢?步骤继续:

7. 回到ui界面:

效果如图:


学到了这里,我们再来回顾一下在Qt入门3——常用控件1中所写的“给女神表白的程序”,当时鼠标点击的时候按钮才会移动,现在我希望鼠标进入按钮,按钮就随机移动,代码如下:

1.按照如上步骤,添加一个Button类,再将“拒绝”按钮提升为Button类

2.重写enterEvent:

#include "button.h"Button::Button(QWidget* parent) : QPushButton(parent)
{srand(time(0));
}void Button::enterEvent(QEvent *event)
{(void) event;//获取父窗口QWidget* parentwidget = this->parentWidget();//获取父窗口可用区域的大小int width = parentwidget->geometry().width();int height = parentwidget->geometry().height();int x = rand() % width;int y = rand() % height;this->move(x,y);
}

效果如图:按钮还没来得及点击就跑了:


示例2:鼠标点击事件(mousePressEvent)

当鼠标点击时,获取相应的坐标值

1. 创建两个label:

2. 按照示例1的7,将下面的label提升。

3. 在label.h中创建一个私有变量QString类型的私有变量coordText

4. 重写mousePressEvent函数:(详细步骤参考示例1)

void Label::mousePressEvent(QMouseEvent *ev)
{if(ev->button() == Qt::LeftButton){coordText = QString("此处以label为准的坐标为:(%1, %2)").arg(ev->x()).arg(ev->y());}else if(ev->button() == Qt::RightButton){coordText = QString("此处以主窗口为准的坐标:(%1, %2)").arg(ev->globalX()).arg(ev->globalY());}this->setText(coordText);
}

效果如图:

鼠标释放事件(mouseReleaseEvent)与鼠标双击事件(mouseDoubleClickEvent)与示例2相同,不过是需要重写的函数不同罢了,此处不再演示。


示例3:鼠标移动事件(mouseMoveEvent)

此示例让鼠标移动事件发生在整个窗口,所以不再自定义类。

1.在ui界面创建一个label来显示鼠标移动的坐标

2.重写mouseMoveEvent:

void Widget::mouseMoveEvent(QMouseEvent *event)
{ui->label->setText("(" + QString::number(event->x()) + "," + QString::number(event->y()) + ")");
}

3. 

此时运行程序,不会有任何反应,这是因为鼠标移动不同于鼠标按下和释放,随便移动一下鼠标就会产生大量的鼠标移动事件。当进行捕获事件时,尤其是执行一些复杂的逻辑时,程序的负担会很重,可能会产生卡顿的情况。所以默认情况下Qt不会对鼠标移动事件进行跟踪,除非显式地告诉Qt:

//在构造函数中将setMouseTracking设为true
this->setMouseTracking(true);

效果如图:


示例4:鼠标滚轮滑动事件(wheelEvent)

1.在ui界面创建一个label来显示鼠标移动的坐标

2.重写wheelEvent

void Widget::wheelEvent(QWheelEvent *event)
{//delta()获取到这次事件鼠标滚轮滚动了多远ui->label->setText(QString::number(event->delta()));
}

效果如图:滚动一次为120像素

3. 按键事件

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

可以在Qt帮助文档中查看QKeyEvent类:

组合按键:

示例:

void Widget::keyPressEvent(QKeyEvent *event)
{//用label显示按下的按键对应的valueui->label->setText(QString::number(event->key()));//用label_2显示按下的单个按键if(event->key() == Qt::Key_A){ui->label_2->setText("按下了A键");}//用label_3显示按下的组合按键if(event->key() == Qt::Key_A && event->modifiers() == Qt::ControlModifier){ui->label_3->setText("按下了ctrl+A键");}
}

效果如图:

4. 定时器

Qt 中在进行窗口程序的处理过程中,经常要周期性的执行某些操作,或者制作一些动画效果,使用定时器就可以实现。所谓定时器就是在间隔一定时间后,去执行某一个任务。

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

QTimerEvent类用来描述一个定时器事件。在使用时需要通过startTimer()函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整型值代表 这个定时器。当定时器溢出时(即定时时间到达)就可以在timerEvent()函数中获取该定时器的编号来进行相关操作;

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

示例:

1.ui界面创建定时器

2. 重写timerEvent

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//开启定时器事件//此处timerId是一个定时器的身份标识timerId = this->startTimer(1000);//timeId为此类的私有变量
}void Widget::timerEvent(QTimerEvent *event)
{//如果一个程序中存在多个定时器,(startTimer创建的定时器),此时每个定时器都会触发timerEvent函数//先判断这次触发是否是我们想要的定时器触发的if(event->timerId() != this->timerId){//如果不是我们的定时器触发的,就直接忽略//当前程序中只有这一个定时器return;}int value = ui->lcdNumber->intValue();if(value <= 0){//停止定时器this->killTimer(this->timerId);return;}value -= 1;ui->lcdNumber->display(value);
}

效果如图:

5. 窗口事件

窗口事件有窗口移动事件(moveEvent)和窗口大小改变事件(resizeEvent)。

示例:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(ui->label);layout->addWidget(ui->label_2);this->setLayout(layout);
}Widget::~Widget()
{delete ui;
}void Widget::moveEvent(QMoveEvent *event)
{QPoint pos = event->pos();QString text = QString("窗口现在的坐标为(%1,%2)").arg(pos.x()).arg(pos.y());ui->label->setText(text);
}void Widget::resizeEvent(QResizeEvent *event)
{QSize size = event->size();QString text = QString("窗口现在的长度为:%1,宽度为:%2").arg(size.width()).arg(size.height());ui->label_2->setText(text);
}

相关文章:

Qt入门7——Qt事件

目录 1. Qt事件介绍&#xff1a; 2. 事件的处理 示例1&#xff1a;鼠标进入(enterEvent)与离开事件(leaveEvent) 示例2&#xff1a;鼠标点击事件(mousePressEvent) 示例3&#xff1a;鼠标移动事件(mouseMoveEvent) 3. 按键事件 4. 定时器 5. 窗口事件 1. Qt事件介绍&a…...

CTF之密码学(仓颉编码)

一、仓颉码&#xff08;用于建立中文索引&#xff09; 定义与目标&#xff1a; 仓颉码是为了建立中文的索引观念而设计的一种编码方式。其主要目标是方便对中文资料或程式进行索引功能的处理。 工作原理&#xff1a; 仓颉码的索引以ASCII的字符码为基准&#xff0c;但在内部会转…...

面向人工智能安全的多维应对策略

• 制定并实施人工智能伦理框架 国家和行业层面需建立AI伦理原则&#xff0c;将其融入研发与应用中&#xff0c;强化科研人员的伦理培训&#xff0c;推动全球AI伦理框架的制定。 • 加强可信数字内容体系建设 构建可信的互联网内容体系以应对深度伪造带来的安全威胁&#xff…...

考研英语翻译与大小作文

名词动化词 1 持有 harbor2 2 反映 mirror 3 缩短 bridge 4 使用 harness 5 掩饰 mask/veil 6 修改 tailor 7 汇集 pool 8 控制 curb 9 想象 picture 10 激发 trigger 拉丁…...

视频监控汇聚平台Liveweb视频安防监控实时视频监控系统操作方案

Liveweb国标GB28181视频平台是一种基于国标GB/T28181协议的安防视频流媒体能力平台。它支持多种视频功能&#xff0c;包括实时监控直播、录像、检索与回看、语音对讲、云存储、告警以及平台级联等功能。该平台部署简单、可扩展性强&#xff0c;支持全终端、全平台分发接入的视频…...

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时&#xff0c;同时使用两个指针&#xff08;变量&#xff0c;常用来指向数组、链表等数据结构中的元素位置&am…...

linux环境GitLab服务部署安装及使用

一、GitLab介绍 GitLab是利用Ruby onRails一个开源的版本管理系统&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。 二、GitLab安装 1、先安装相关依赖 yum -y install policycoreutils openssh-server openssh-clients postf…...

MotorCAD:定子绕组中的趋肤效应和邻近效应损耗

MotorCAD 有助于减少定子绕组中的集肤效应和邻近效应损失&#xff0c;优化电动机性能。 了解集肤和邻近效应损失 集肤效应&#xff1a;交流电场在导体中感应出电流回路&#xff0c;增加了中心的磁通链路&#xff0c;导致该位置的电抗更高&#xff0c;结果是电流在表面附近流动…...

R语言机器学习论文(二):数据准备

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据一、数据描述二、数据预处理(一)修改元素名称(二)剔除无关变量(三)缺失值检查(四)重复值检查(五)异常值检查三、描述性统计(一)连续变量数据情…...

FFmpeg:强大的音视频处理工具指南

FFmpeg&#xff1a;强大的音视频处理工具指南 1. FFmpeg简介2. 核心特性2.1 基础功能2.2 支持的格式和编解码器 3. 主要组件3.1 命令行工具3.2 开发库 4. 最新发展5. 安装指南5.1 Windows系统安装5.1.1 直接下载可执行文件5.1.2 使用包管理器安装 5.2 Linux系统安装5.2.1 Ubunt…...

NiFi-从部署到开发(图文详解)

NiFi简介 Apache NiFi 是一款强大的开源数据集成工具&#xff0c;旨在简化数据流的管理、传输和自动化。它提供了直观的用户界面和可视化工具&#xff0c;使用户能够轻松设计、控制和监控复杂的数据流程&#xff0c;NiFi 具备强大的扩展性和可靠性&#xff0c;可用于处理海量数…...

Scala的条件匹配

条件匹配 在 Scala 中&#xff0c;条件匹配主要通过match表达式来实现&#xff0c;它类似于其他语言中的switch语句&#xff0c;但功能更强。 基本语法&#xff1a;match表达式通常与case关键字一起使用。语法格式如下&#xff1a; 输入一段数字&#xff0c;判断属于那个范围…...

如何手搓一个智能激光逗猫棒

背景 最近家里的猫胖了&#xff0c;所以我就想做个逗猫棒。找了一圈市场上的智能逗猫棒&#xff0c;运行轨迹比较单一&#xff0c;互动性不足。 轨迹单一&#xff0c;活动范围有限 而我希望后续可以结合人工智能物联网&#xff0c;通过摄像头来捕捉猫的位置&#xff0c;让小…...

leetcode LCP 开幕式焰火

LCP 44. 开幕式焰火 - 力扣&#xff08;LeetCode&#xff09; 「力扣挑战赛」开幕式开始了&#xff0c;空中绽放了一颗二叉树形的巨型焰火。 给定一棵二叉树 root 代表焰火&#xff0c;节点值表示巨型焰火这一位置的颜色种类。请帮小扣计算巨型焰火有多少种不同的颜色。 示例…...

使用GDI对象绘制UI时需要注意的若干细节问题总结

目录 1、一个bitmap不能同时被选进两个dc中 2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数 3、不能删除已经被选入DC中的GDI对象 4、使用完的GDI对象&#xff0c;要将之释放掉&#xff0c;否则会导致GDI对象泄漏 5、CreateCompatibleBitmap返回错…...

51单片机(STC89C52RC版本)学习笔记(更新中...)

文章目录 参考资料1. 准备工作1.1 win10配置51单片机开发环境1.1 Ubuntu配置51单片机开发环境问题1&#xff1a;mcs51/8051.h依赖于mcs51/lint.h问题2&#xff1a;提示找不到头文件mcs51/8051.h 2. 认识51单片机2.1 STC89C52单片机2.2 管脚图2.3 原理图2.4 按键抖动2.5 头文件说…...

七:仪表盘安装-controller node

一&#xff1a;工具、环境准备-controller node 二&#xff1a;OpenStack环境准备-controller node 三&#xff1a;安装服务-controller node 四&#xff1a;工具、环境准备-compute node 五&#xff1a;OpenStack环境准备-compute node 六&#xff1a;安装服务-compute node 七…...

C++设计模式之外观模式

动机 下图中左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合&#xff0c;随着外部客户程序和各子系统的演化&#xff0c;这种过多的耦合面临很多变化的挑战。 如何简化外部客户程序和系统间的交互接口&#xff1f;如何将外部客户程序的演化和内部子系统…...

显卡(Graphics Processing Unit,GPU)比特币挖矿

1. 比特币挖矿基本原理 比特币挖矿是通过参与比特币网络的共识机制——工作量证明&#xff08;Proof of Work, PoW&#xff09; 来完成的。具体来说&#xff0c;矿工通过不断尝试不同的哈希值&#xff0c;以解决一个难度逐渐增大的数学问题&#xff0c;从而验证交易并获得比特…...

【SARL】单智能体强化学习(Single-Agent Reinforcement Learning)《纲要》

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...