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…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
