Qt 5.14.2 学习记录 —— 십구 事件
文章目录
- 1、事件的概念
- 2、处理事件
- 3、鼠标事件
- 1、鼠标单击和双击
- 2、鼠标移动
- 3、鼠标滚轮滚动
- 4、键盘事件
- 5、定时器事件
- 6、窗口移动和大小改变事件
1、事件的概念
用户进行操作时会产生事件,事件可以关联处理函数。Qt封装了操作系统的事件机制,然后进一步封装得到了信号槽。事件是信号槽的底层机制。如果一个行为在Qt中没有对应的信号,那么就需要重写事件处理函数。事件处理函数都是虚函数,这样才能被重写。关于事件处理函数,看Qt文档。

QEvent就是事件,下面则是各种子事件。一部分常见事件:

事件分发,事件过滤属于Qt事件机制底层的逻辑,Qt对此给程序员提供了一些API可用。
事件分发重写event函数,能获取所有事件,但这样程序员有可能因此出现大错误。
事件过滤顾名思义,它是事件分发的其中一步操作,它针对的是某一类型的时间。
2、处理事件
处理也就是写处理函数。重写事件处理函数,也就利用了多态机制。创建子类,继承自Qt自带的类,在子类中重写父类的事件处理函数。
处理鼠标进入和鼠标离开事件
创建一个QWidget项目,放一个label到界面,接下来的程序在鼠标进入label区域时label文本显示鼠标进入,离开时显示鼠标离开。可以把label的frameShape属性改为Box,方便观察。
在当前项目下,创建一个C++类,继承自QLabel。

在label.h文件中引入QLabel头文件。
// label.h#include <QWidget>
#include <QLabel>class Label : public QLabel
{Q_OBJECT
public:Label(QWidget* parent);void enterEvent(QEvent* event);void leaveEvent(QEvent* event);
};// label.cpp#include "label.h"
#include <QDebug>Label::Label(QWidget* parent) : QLabel(parent)
{}void Label::enterEvent(QEvent *event)
{(void) event;qDebug() << "enterEvent";
}void Label::leaveEvent(QEvent *event)
{(void) event;qDebug() << "leaveEvent";
}
自定义的类是Label,但是界面中的label是QLabel的,所以现在这些处理函数还不起作用。解决办法就是右键label,提升为,按照自定义的类名和头文件名来填写,不选全局包含;点击添加,选中新添加的项,提升即可。
也可以不单独创建一个类,直接在Widget文件中写逻辑,那么此时就不是在label里事件发生时有处理,而是在Qt整个窗口内触发事件时都会被处理。
3、鼠标事件
在QWidget项目下,创建自定义类Label,还是用QLabel作为父类,在界面中创建一个label,提升为Label类的。
1、鼠标单击和双击
// label.h#include <QWidget>
#include <QMouseEvent>class Label : public QLabel
{Q_OBJECT
public:Label(QWidget* parent);// 鼠标左键右键滚轮触发void mousePressEvent(QMouseEvent* event);
};// label.cpp#include "label.h"
#include <QDebug>Label::Label(QWidget* parent) : QLabel(parent)
{}void Label::mousePressEvent(QMouseEvent *event)
{// 两个方式// 以label对象左上角为原点qDebug() << event->x() << ", " << event->y();// 以屏幕左上角为原点qDebug() << event->globalX() << ", " << event->globalY();// Qt罗列了一些按键if (event->button() == Qt::LeftButton)qDebug() << "按下左键";else if (event->button() == Qt::RightButton)qDebug() << "按下右键";
}
抬起和双击
// label.hvoid mouseReleaseEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);// label.cppvoid Label::mouseReleaseEvent(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() << "双击右键";
}
2、鼠标移动
// label.hvoid mouseMoveEvent(QMouseEvent* event);// label.cppvoid Label::mouseMoveEvent(QMouseEvent *event)
{qDebug() << event->x() << event->y();
}
但是实际运行后,不会打印,是因为鼠标只要一移动,会触发大量的鼠标移动事件,那么为了程序运行流畅,Qt默认不追踪这个事件,所以不会触发。解决办法就是解开这个限制即可
Label::Label(QWidget* parent) : QLabel(parent)
{this->setMouseTracking(true);
}
3、鼠标滚轮滚动
// label.h// 通过delta()来获取这次鼠标滚轮滚了多远
#include <QWheelEvent>
public:void wheelEvent(QWheelEvent* event);
private:int total;// label.cppLabel::Label(QWidget* parent) : QLabel(parent)
{total = 0;
}void Label::wheelEvent(QWheelEvent *event)
{//qDebug() << event->delta();// 计算总的滚动距离total += event->delta();qDebug() << total;
}
4、键盘事件
QWidget项目,这次不创建子类,直接在widget文件中写
// widget.h#include <QWidget>
#include <QKeyEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void keyPressEvent(QKeyEvent *event);private:Ui::Widget *ui;
};// widget.cpp
#include <QDebug>void Widget::keyPressEvent(QKeyEvent *event)
{// 组合键, 用修饰符modifiers来获取// ctrl + aif (event->key() == Qt::Key_A && event->modifiers() == Qt::ControlModifier)qDebug() << "组合键ctrl + A";else if (event->key() == Qt::Key_A)qDebug() << "按下了A键";else qDebug() << event->key();
}
5、定时器事件
QTimer实现定时器功能,它的基础是QTimerEvent定时器事件。
QWidget项目,放一个LCD Numbers到界面中
// widget.hvoid timerEvent(QTimerEvent* event);
int timerId;// widget.cppWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 开启定时器事件// timerId身份标识, 类似于Linux文件标识符timerId = this->startTimer(1000);
}void Widget::timerEvent(QTimerEvent *event)
{// 如果一个程序存在多个定时器, 那么每个定时器都会触发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);
}
6、窗口移动和大小改变事件
// widget.h#include <QWidget>
#include <QMoveEvent>
#include <QResizeEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void moveEvent(QMoveEvent* event);void resizeEvent(QResizeEvent* event);private:Ui::Widget *ui;
};// widget.cpp#include <QDebug>void Widget::moveEvent(QMoveEvent *event)
{qDebug() << "之前的位置: " << event->oldPos();qDebug() << "现在的位置: " << event->pos();
}void Widget::resizeEvent(QResizeEvent *event)
{qDebug() << event->size();
}
结束。
相关文章:
Qt 5.14.2 学习记录 —— 십구 事件
文章目录 1、事件的概念2、处理事件3、鼠标事件1、鼠标单击和双击2、鼠标移动3、鼠标滚轮滚动 4、键盘事件5、定时器事件6、窗口移动和大小改变事件 1、事件的概念 用户进行操作时会产生事件,事件可以关联处理函数。Qt封装了操作系统的事件机制,然后进一…...
国产编辑器EverEdit - 命令窗口应用详解
1 命令窗口应用详解 1.1 应用场景 有时需要在EverEdit中执行一些命令行工具,甚至想把当前文档做为参数,传递给命令进行一些文本分析,比如:一些常用的文本处理工具,gawk.exe等。 1.2 使用方法 命令窗口的使用在官方手…...
iOS开发设计模式篇第二篇MVVM设计模式
目录 一、什么是MVVM 二、MVVM 的主要特点 三、MVVM 的架构图 四、MVVM 与其他模式的对比 五、如何在iOS中实现MVVM 1.Model 2.ViewModel 3.View (ViewController) 4.双向绑定 5.文中完整的代码地址 六、MVVM 的优缺点 1.优点 2.缺点 七、MVVM 的应用场景 八、结…...
【深度学习】3.损失函数的作用
损失函数的作用 假设把猫这张图片分成四个像素点,分别为:56、231、24、2(实际应该是三维的,因为还有颜色通道的维度,这里简化成二维)。 像素点拿到以后,进行三分类,粉红色为第一组W…...
深入MapReduce——计算模型设计
引入 通过引入篇,我们可以总结,MapReduce针对海量数据计算核心痛点的解法如下: 统一编程模型,降低用户使用门槛分而治之,利用了并行处理提高计算效率移动计算,减少硬件瓶颈的限制 优秀的设计,…...
小黑日常积累:学习了CROSS APPLY字段,将sqlserver中字段通过分隔符拆分并统计
问题 字段中的元素是通过分隔符进行拼接的,我需要统计元素的个数,例如: 代码 样例表创建 -- 创建样例表 create table #Tmp_Table (ID int IDENTITY (1,1) not null,Strs nvarchar(50),primary key (ID) ); insert into #Tmp_Table (Strs) VALUES…...
WebSocket知识点笔记(一)
WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务端之间的消息传递更加高效,允许服务器主动向客户端推送数据。 一.WebSocket全双工通信 WebSocket提供了真正的双向通信,客户端和服务端可以同时发送和接收消息 …...
安宝特方案 | AR在供应链管理中的应用:提升效率与透明度
随着全球化的不断深入和市场需求的快速变化,企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本,并确保信息的透明度,成为了各大行业亟待解决的问题。而增强现实(AR)技术,特别…...
基于Springboot + vue实现的美发门店管理系统
💖学习知识需费心, 📕整理归纳更费神。 🎉源码免费人人喜, 🔥码农福利等你领! 💖常来我家多看看, 📕网址:扣棣编程, 🎉感谢支持常陪伴, 🔥点赞关注别忘记! 💖山高路远坑又深, 📕大军纵横任驰奔, 🎉谁敢横刀立马行? 🔥唯有点赞+关注成! �…...
springboot中配置logback-spring.xml
一、在src/main/resources目录下,也就是在classpath路径下创建logback-spring.xml 注:springboot框架自动配置,如果更换名称,可在配置文件指定该文件即可 <?xml version"1.0" encoding"UTF-8"?> <…...
从63 秒到 0.482 秒:深入剖析 MySQL 分页查询优化
在日常开发中,数据库查询性能问题就像潜伏的“地雷”,总在高并发或数据量庞大的场景下引爆。尤其是当你运行一条简单的分页查询时,结果却让用户苦苦等待,甚至拖垮了系统。这种情况你是否遇到过? 你可能会想࿱…...
细说机器学习算法之过拟合与欠拟合
系列文章目录 第一章:Pyhton机器学习算法之KNN 第二章:Pyhton机器学习算法之K—Means 第三章:Pyhton机器学习算法之随机森林 第四章:Pyhton机器学习算法之线性回归 第五章:Pyhton机器学习算法之有监督学习与无监督…...
C/C++ 虚函数
虚函数的定义 虚函数是指在基类内部声明的成员函数前面添加关键字 virtual 指明的函数虚函数存在的意义是为了实现多态,让派生类能够重写(override)其基类的成员函数派生类重写基类的虚函数时,可以添加 virtual 关键字,但不是必须这么做虚函…...
【3GPP】【5G】注销流程(Deregistration procedures)
1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 3.1.2 Deregistration procedures 3.1.2.1 UE-initiated Deregistration 3.1.2.2 Network-initiated Deregistration 3.1.2 Deregistration procedures 注销流程…...
【小游戏篇】三子棋游戏
硬控我一上午,小编还是太菜了,大家可以自行升级电脑难度,也可以升级游戏到五子棋 1.game.h #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3//初始化棋盘 void InitBoa…...
7-Zip Mark-of-the-Web绕过漏洞复现(CVE-2025-0411)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
2025年国产化推进.NET跨平台应用框架推荐
2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费(MIT License)的跨平台框架(支持Android、iOS、macOS 和 Windows多平台运行),是 Xamarin.Forms 的进化版,从移动场景扩展到…...
关于ARM和汇编语言
一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段:控制器器通过地址总线向存储器发送想要获取的指令的地址编号,存储器将指定的指令发送给处理器 译码阶段:控制器对指令进行分…...
2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)
原文链接: https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状,关键技术 创新方向,以及行业应用的具体情况,通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…...
QTableView和QTableWidget的关系与区别
QTableView 和 QTableWidget 都是 Qt 框架中用于显示表格数据的控件,但它们在设计和使用上有一些重要的区别。 QTableView 模型-视图架构:QTableView 是 Qt 模型-视图架构的一部分,它与模型(如 QStandardItemModel 或自定义的 QA…...
Topit:macOS窗口置顶神器,让多任务处理效率翻倍
Topit:macOS窗口置顶神器,让多任务处理效率翻倍 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否经常在macOS上同时处理多个任务时…...
BLE蓝牙扫描深度剖析:扫描原理、核心参数、前后台差异
一、前言BLE设备交互分为两大角色:广播端(外设Peripheral)与扫描端(中心Central)。上一篇博客详解了四大广播模式,本文聚焦配套核心能力——BLE扫描机制。绝大多数蓝牙开发疑难问题:前台能扫后台…...
智慧无人机巡检-无人机可见光红外数据集 无人机多模态检测数据集 红外与可见光检测数据集
智慧无人机巡检-无人机可见光红外数据集,已完成标注,可导出各种常用数据集,yolo,voc,coco等格式。可见光33000张,红外16100张,目标一张一个 无人机可见光红外目标数据集项目详细信息数据集名称无…...
贵阳婚礼西服定制攻略:面料、工艺、版型避坑指南
婚礼西装是男士婚礼造型的核心,区别于日常商务正装,婚礼西服更看重版型精致度、面料质感、上身挺拔感以及镜头适配度。在贵阳备婚的新人,大多会放弃成品西装,选择专属定制服务。但本地婚礼西服定制市场参差不齐,很多新…...
论文写作效率翻倍?okbiye 毕业论文 AI 功能全解析:从需求到终稿的规范路径
okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 一、从界面看本质:okbiye 毕业论文 AI 写作的设计逻辑 打开 okbiye 的毕业论文 AI 写作页面,首先能感受到的是清晰的…...
2026 文章代码高亮方案选型
将基于 Prism.js 或 Highlight.js 的传统高亮方案与基于 Shiki 的现代化高亮方案进行对比,其核心区别在于底层解析原理的不同(正则表达式 vs. TextMate 语法树)。 以下是两种方案的底层原理、各自优缺点、核心对比矩阵以及适用场景的详细分析…...
终极指南:5步快速掌握免费的3D点云标注工具labelCloud
终极指南:5步快速掌握免费的3D点云标注工具labelCloud 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 想要为自动驾驶、机器人视觉或3D目标检测…...
基于雷达与光敏传感器的低功耗智能窗防设备设计与实现
1. 项目概述:一个基于雷达与光敏的智能窗防设备几年前,我因为一次短暂的出差,家里空置了几天,回来后就一直琢磨着怎么给家里的窗户加点“动静”。市面上的智能安防摄像头固然好,但要么需要复杂的布线,要么云…...
什么情况下会核销贷款
贷款核销的核心前提是:贷款被认定为 “损失类” 且经 “穷尽追偿” 仍无法收回,银行按监管与会计规则从账面冲销,但债权不消灭、仍可追偿。一、核心认定条件(满足其一即可)破产 / 注销 / 吊销:借款人和担保…...
为什么你的霓虹总像“塑料灯带”?Midjourney光子散射模拟缺陷曝光:3个被官方隐瞒的--sref调参禁区
更多请点击: https://kaifayun.com 第一章:为什么你的霓虹总像“塑料灯带”? 霓虹效果在现代 UI 设计中无处不在——按钮悬停、加载指示器、焦点高亮……但多数实现却流于表面:生硬的 box-shadow、固定色值的渐变边框、缺乏物理感…...
