QT事件。

目录

事件

鼠标事件

mousePressEvnet

mouseMoveEvent

事件过滤

定时器事件


事件

事件分配机制:当某个事件(鼠标、键盘)发生的时候,窗口就会收到这个事件,并且调用相应的事件处理函数,事件处理函数的命名都是以Event结尾的,事件先会到达窗口的event函数event函数返回值:true表示该事件得到处理,如果是false,没被处理,事件会继续传递到父窗口通过判断QEvent参数的类型得知事件的类型后,调用相应的事件处理函数//判断event的类型

鼠标事件

mousePressEvnet,mouseReleseEvent,mouseMoveEvent

mousePressEvnet

通过获取鼠标事件处理函数的参数,获取它的坐标和点击了哪个按键
//获取坐标
int x= ex->x();int y = ex->y();
//获取鼠标按键Qt::MouseButton btn=ey->button();

#ifndef WIDGET_H  // 如果未定义 WIDGET_H
#define WIDGET_H  // 定义 WIDGET_H#include <QWidget>  // 包含 QWidget 类的头文件
#include <QMouseEvent>  // 包含 QMouseEvent 类的头文件
#include <QLabel>  // 包含 QLabel 类的头文件QT_BEGIN_NAMESPACE  // 开始 Qt 命名空间
namespace Ui {
class Widget;  // 声明 Ui 命名空间中的 Widget 类
}
QT_END_NAMESPACE  // 结束 Qt 命名空间class Widget : public QWidget  // 定义 Widget 类,继承自 QWidget
{Q_OBJECT  // 宏用于 Qt 的信号和槽机制public:Widget(QWidget *parent = nullptr);  // 构造函数声明,接受一个可选的父对象~Widget();  // 析构函数声明private:Ui::Widget *ui;  // 指向 UI 元素的指针QLabel *label;  // 指向 QLabel 元素的指针protected:void mousePressEvent(QMouseEvent *ev);  // 重写 mousePressEvent 处理鼠标点击事件
};
#endif // WIDGET_H  // 结束 WIDGET_H 保护宏
#include "widget.h"  // 包含 Widget 类的头文件
#include "./ui_widget.h"  // 包含自动生成的 UI 头文件
#include <QLabel>  // 包含 QLabel 类的头文件
#include <QMouseEvent>  // 包含 QMouseEvent 类的头文件// 构造函数
Widget::Widget(QWidget *parent): QWidget(parent)  // 调用基类 QWidget 的构造函数, ui(new Ui::Widget)  // 初始化 UI 对象
{ui->setupUi(this);  // 设置 UI 元素// 创建并设置 QLabellabel = new QLabel(this);  // 创建 QLabel 对象,父对象为当前 Widgetlabel->setGeometry(0, 0, 800, 600);  // 设置 QLabel 的位置和尺寸label->setStyleSheet("border: 1px solid black;");  // 设置 QLabel 的边框样式
}Widget::~Widget()
{delete ui;  // 删除 UI 对象,释放内存
}void Widget::mousePressEvent(QMouseEvent *ev)
{int x = ev->x();  // 获取鼠标点击的 x 坐标int y = ev->y();  // 获取鼠标点击的 y 坐标QString str = QString("[%1 %2]").arg(x).arg(y);  // 创建显示坐标的字符串label->setText(str);  // 设置 QLabel 显示文本为鼠标点击的坐标
}

Qt::MouseButton btn = ev->button();QString strButton = "";if(btn == Qt::LeftButton){strButton = "LeftButton";}if(btn == Qt::RightButton){strButton = "RightButton";}if(btn == Qt::MiddleButton){strButton = "MiddleButton";}

mouseMoveEvent

获取鼠标按键,这里要使用buttons,

获取的鼠标按钮的枚举值按位或的一个值Qt::MouseButtons btns =ev->buttons();
通过按位与的防式来提取按了哪个按键

#include "widget.h"  // 包含 Widget 类的头文件
#include "./ui_widget.h"  // 包含自动生成的 UI 头文件
#include <QLabel>  // 包含 QLabel 类的头文件
#include <QMouseEvent>  // 包含 QMouseEvent 类的头文件
#include <QDebug>  // 包含 QDebug 类的头文件// 构造函数
Widget::Widget(QWidget *parent): QWidget(parent)  // 调用基类 QWidget 的构造函数, ui(new Ui::Widget)  // 初始化 UI 对象
{ui->setupUi(this);  // 设置 UI 元素// 创建并设置 QLabellabel = new QLabel(this);  // 创建 QLabel 对象,父对象为当前 Widgetlabel->setGeometry(0, 0, 800, 600);  // 设置 QLabel 的位置和尺寸label->setStyleSheet("border: 1px solid black;");  // 设置 QLabel 的边框样式label->setAttribute(Qt::WA_TransparentForMouseEvents);  // 使 QLabel 对鼠标事件透明(不拦截事件)this->setMouseTracking(true);  // 启用 Widget 的鼠标跟踪功能,使得 mouseMoveEvent 能够被触发
}// 析构函数
Widget::~Widget()
{delete ui;  // 删除 UI 对象
}// 鼠标按下事件处理函数
void Widget::mousePressEvent(QMouseEvent *ev)
{int x = ev->x();  // 获取鼠标点击的 x 坐标int y = ev->y();  // 获取鼠标点击的 y 坐标Qt::MouseButtons btns = ev->buttons();  // 获取鼠标按键状态QString strButton = "";  // 存储被按下的鼠标按钮信息if(btns & Qt::LeftButton) {  // 检查左键是否被按下strButton += "LeftButton";  // 添加 "LeftButton" 到字符串}if(btns & Qt::RightButton) {  // 检查右键是否被按下strButton += "RightButton";  // 添加 "RightButton" 到字符串}if(btns & Qt::MiddleButton) {  // 检查中键是否被按下strButton += "MiddleButton";  // 添加 "MiddleButton" 到字符串}// 设置 QLabel 显示的文本,包括鼠标坐标和按下的按钮QString str = QString("<h1><center>Move[%1 %2][%3]</center></h1>").arg(x).arg(y).arg(strButton);label->setText(str);  // 更新 QLabel 的文本
}// 鼠标移动事件处理函数
void Widget::mouseMoveEvent(QMouseEvent *ev)
{int x = ev->x();  // 获取鼠标移动的 x 坐标int y = ev->y();  // 获取鼠标移动的 y 坐标qDebug() << "Mouse moved to:" << x << y;  // 打印鼠标移动的位置到调试输出// 设置 QLabel 显示的文本,包括鼠标的移动坐标QString str = QString("<h1><center>Move[%1 %2]</center></h1>").arg(x).arg(y);label->setText(str);  // 更新 QLabel 的文本
}

默认情况下,窗口不会主动跟踪鼠标,只有当某个鼠标按键按下的情况下才开始跟踪,如果想一开始跟踪,就要使用以下雨数this->setMouseTracking(true);

事件过滤

窗口调用installEventrilter来安装一个事件过滤器

参数是一个事件过滤器对象Q0bject,该对象的类要重写eventEilter的函数事件过滤的时候,事件会先到达事件过滤器的eventFilter函数

对象可以使用自己作为白己的过滤器

返回值:true表示拦截,false表示不拦截,不拦截情况下事件会继续的到达窗口

#include "widget.h"  // 包含自定义 Widget 类的头文件
#include "./ui_widget.h"  // 包含自动生成的 UI 文件头文件
#include <QLabel>  // 包含 QLabel 类的头文件
#include <QMouseEvent>  // 包含 QMouseEvent 类的头文件
#include <QDebug>  // 包含 QDebug 类的头文件// 构造函数
Widget::Widget(QWidget *parent): QWidget(parent)  // 调用基类构造函数,设置父窗口, ui(new Ui::Widget)  // 初始化 UI 对象
{ui->setupUi(this);  // 设置 UI 组件// 创建 QLabel 实例,并将其设置为当前 Widget 的子组件label = new QLabel(this);label->setGeometry(0, 0, 800, 600);  // 设置 QLabel 的几何位置和大小label->setStyleSheet("border: 1px solid black;");  // 设置 QLabel 的样式,边框为黑色label->setAttribute(Qt::WA_TransparentForMouseEvents);  // 设置 QLabel 透明,不接收鼠标事件this->setMouseTracking(true);  // 使 Widget 能够跟踪鼠标移动事件this->installEventFilter(this);  // 在当前 Widget 上安装事件过滤器
}// 析构函数
Widget::~Widget()
{delete ui;  // 删除 UI 对象,释放资源
}// 处理鼠标按下事件
void Widget::mousePressEvent(QMouseEvent *ev)
{int x = ev->x();  // 获取鼠标按下时的 X 坐标int y = ev->y();  // 获取鼠标按下时的 Y 坐标Qt::MouseButtons btns = ev->buttons();  // 获取按下的鼠标按钮QString strButton = "";  // 初始化按钮状态字符串if(btns & Qt::LeftButton){  // 检查是否按下了左键strButton += "LeftButton";}if(btns & Qt::RightButton){  // 检查是否按下了右键strButton += "RightButton";}if(btns & Qt::MiddleButton){  // 检查是否按下了中键strButton += "MiddleButton";}// 设置 QLabel 显示鼠标按下的位置和按钮状态QString str = QString("<h1><center>Move[%1 %2][%3]</center></h1>").arg(x).arg(y).arg(strButton);label->setText(str);  // 更新 QLabel 的文本
}// 处理鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *ev)
{int x = ev->x();  // 获取鼠标移动时的 X 坐标int y = ev->y();  // 获取鼠标移动时的 Y 坐标qDebug() << "Mouse moved to:" << x << y;  // 输出调试信息// 设置 QLabel 显示鼠标移动的位置QString str = QString("<h1><center>Move[%1 %2]</center></h1>").arg(x).arg(y);label->setText(str);  // 更新 QLabel 的文本
}// 事件过滤器
bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QEvent::MouseMove){  // 检查事件类型是否为鼠标移动return true;  // 事件被处理,返回 true,表示事件不再传递给其他处理器}return false;  // 其他事件传递给基类处理器
}

定时器事件

#include "widget.h"         // 包含 Widget 类的头文件
#include "./ui_widget.h"    // 包含 UI 设计器生成的头文件
#include <QTimer>           // 包含 QTimer 类的头文件Widget::Widget(QWidget *parent)  // Widget 构造函数: QWidget(parent)           // 调用基类 QWidget 的构造函数, ui(new Ui::Widget)        // 创建 UI 对象, timer(new QTimer(this))   // 创建 QTimer 对象,并将 this 作为其父对象
{ui->setupUi(this);         // 设置 UI 界面connect(timer, &QTimer::timeout, [=]() {  // 连接 timer 的 timeout 信号到 lambda 函数static int num = 1;        // 静态局部变量,用于计数this->ui->lcdNumber->display(num++); // 更新 LCD 显示的数字});
}Widget::~Widget()  // Widget 析构函数
{delete ui;      // 删除 UI 对象// timer 不需要手动删除,因为它的父对象是 this
}void Widget::on_pushButton_clicked()  // 当 pushButton 被点击时调用
{timer->start(1000);  // 启动计时器,设置为每秒触发一次
}void Widget::on_pushButton_2_clicked()  // 当 pushButton_2 被点击时调用
{this->timer->stop();  // 停止计时器
}

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

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

相关文章

总线学习6--I2C(EEPROM)

鉴于I2C的项目还是很多&#xff0c;所以又多做了一个试验。 1 环境说明 主控还是树莓派Pico。eeprom用的是之前买的AT24C02。 软件环境还是老朋友micropython。 接线是这样接的。 24C02 PinPico PinVCC3.3VGNDGNDSDAGP16SCLGP17 2 代码 代码如下&#xff1a; from machine …

[Python学习日记-5] Python中的注释

[Python学习日记-5] Python中的注释 简介 注释的示例和使用说明 代码注释原则 简介 随着学习的深入。用不了多久&#xff0c;你就可以写上千甚至上万行的复杂代码啦&#xff0c;有些代码你花了很久写出来&#xff0c;但过了些天再回去看&#xff0c;发现竟然看不懂了&#x…

【wsl】wsl + vscode 中使用 typora 打开 markdown 文件

vscode 连接好wsl 使用Open in External App 一个五星好评的插件Open in External App则可以在vscode中用typora打开md文件&#xff0c;不仅如此&#xff0c;还有设定其他应用打开相应的文件&#xff0c;比如chrome打开html。插件食用方法也比较简单&#xff0c;安装后&#…

Linux 软件编程学习第十一天

1.管道&#xff1a; 进程间通信最简单的形式 2.信号&#xff1a; 内核层和用户层通信的一种方式 1.信号类型&#xff1a; 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 1…

gitea docker 快捷安装部署

前言 在前一篇博文&#xff08;什么是 Gitea&#xff1f;&#xff09;中&#xff0c;我们详细介绍了gitea的功能特性&#xff0c;以及其与其它git服务器之间的特性多维度对比。 在本文中&#xff0c;我们将详细介绍gitea的快捷安装部署&#xff0c;docker方式&#xff01; 1…

Linux磁盘管理与文件系统(二):实用工具和命令、fdisk分区示例

文章目录 4、查看或管理磁盘分区-fdisk格式选项示例 4、示例&#xff1a;使用 fdisk 命令创建分区需求操作步骤 5、创建文件系统-mkfs格式常用选项示例创建其他类型的文件系统 6、创建文件系统-mkswap格式常用选项示例拓展&#xff1a;关闭和启用交换分区拓展&#xff1a;swap分…

Visual Studio Code搭建VUE开发环境

Vue.js 是一款易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;提供容易上手的 API 和一流的文档。可以用来开启PC网页、移动端网页页面、小程序等等 实验环境 VS Code 1.88.1Node 20.16.0Vue3.2…

趋动科技联合超聚变,让超融合彻底释放算力潜能

近日&#xff0c;趋动科技联合超聚变推出基于FusionOne HCI超融合的AI算力资源池化解决方案。该方案基于业内领先的AI算力资源池化技术&#xff0c;实现智能调度、异构算力融合管理等功能&#xff0c;让客户能够低成本获取AI算力&#xff0c;便捷使用AI算力&#xff0c;加速AI业…

AI学习记录 - transformer的Embedding层

创作不易&#xff0c;免费的赞 前面有介绍了GPT2如何进行token化的过程&#xff0c;现在讲下transformer的Embedding层 Embedding层就是一个巨大的矩阵&#xff0c;边长分别是词汇表长度和词向量维度&#xff0c;矩阵里面的每一个数字都是一个随机初始化的&#xff0c;或者是…

TinyWebserver的复现与改进(1):服务器环境的搭建与测试

计划开一个新坑, 主要是复现qinguoyi/TinyWebServer项目&#xff0c;并且使用其它模块提升性能。 本文开发服务器配置&#xff1a;腾讯云轻量级服务器&#xff0c;CPU - 2核 内存 - 2GB&#xff0c;操作系统 Ubuntu Server 18.04.1 LTS 64bit 打开端口 需要打开服务器3306、80…

常见硬件工程师面试题(四)

大家好&#xff0c;我是山羊君Goat。 对于硬件工程师&#xff0c;学习的东西主要和电路硬件相关&#xff0c;所以在硬件工程师的面试中&#xff0c;对于经验是十分看重的&#xff0c;像PCB设计&#xff0c;电路设计原理&#xff0c;模拟电路&#xff0c;数字电路等等相关的知识…

DriftingBlues2靶机渗透测试

DriftingBlues2靶机 文章目录 DriftingBlues2靶机信息收集FTP渗透web渗透权限提升靶机总结 信息收集 nmap扫描得到21,22和80端口&#xff0c;其中21ftp协议可以使用匿名用户登录 使用目录扫描一下网站&#xff0c;得到了blog目录 FTP渗透 匿名用户登录进去&#xff0c;发现…

WPF篇(8)- Button按钮

1. 用法解析 Button因为继承了ButtonBase&#xff0c;而ButtonBase又继承了ContentControl&#xff0c;所以&#xff0c;Button可以通过设置Content属性来设置要显示的内容。例如 <Button Content"确定"/>我们使用Button的时机&#xff0c;通常是鼠标点击事件…

补录:day023-回溯法

40.组合II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 思路:组合题目二&#xff0c;这个题…

2024世界机器人大会将于8月21日至25日在京举行

2024年的世界机器人大会预定于8月21日至25日&#xff0c;在北京经济技术开发区的北人亦创国际会展中心隆重举办。 本届大会以“共育新质生产力 共享智能新未来”为核心主题&#xff0c;将汇聚来自全球超过300位的机器人行业专家、国际组织代表、杰出科学家以及企业家&#xff0…

【云原生】Prometheus Pushgateway使用详解

目录 一、前言 二、Pushgateway概述 2.1 什么是Pushgateway 2.1.1 Pushgateway在Prometheus中的位置 2.2 为什么需要Pushgateway 2.3 Pushgateway作用 2.4 Pushgateway 工作原理 2.5 Pushgateway 使用场景 2.6 Pushgateway 优缺点 三、Pushgateway 部署 3.1 二进制安…

ip透传及实例

IP 透传介绍 “IP 透传”&#xff08;IP Passthrough&#xff09;是一种网络配置方式&#xff0c;指的是将网络服务提供商分配给用户的公网 IP 地址直接传递或分配给用户设备&#xff0c;而不是经过网络地址转换&#xff08;NAT&#xff09;处理。 在传统的网络环境中&#xf…

HTML5+JavaScript绘制彩虹和云朵

HTML5JavaScript绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…

Qt WebEngine基于WebEngineScript注入js脚本

在之前的文章中&#xff0c;我们介绍了Qt WebEngine注入js的用法&#xff0c;及runJavaScript()的用法&#xff0c;该方法主要是用在页面加载完成后&#xff0c;为了和网页做一些交互时使用。有时候需要监听网页加载完成的一些状态或信息&#xff0c;则需要网页加载前注入js来实…

VSCODE platformio ESP32-S3 内置 JTAG 接口断点单步调试笔记

ESP32 S3的两种JTAG调试方法 ESP32 S3的有两种JTAG调试方法&#xff0c;直接连接板子上的JTAG引脚进行调试&#xff0c;或者用ESP32-S3 内置 JTAG 接口进行调试&#xff0c;这些方法有助于开发者在开发过程中进行更深入的调试。 1、ESP32-S3 内置 JTAG 接口 使用 ESP32-S3 内…