QT--事件(丰富操作,高级功能)

一、事件

1.事件与信号的区别
  • 事件来自外部,是随机发生的。信号来自内部,是主动发生的。有点像外中断和内中断的区别。
  • 事件:适用于处理系统级别的输入和状态变化,种类繁多,能够应对复杂的交互需求。
  • 信号/槽:适用于对象间通信和状态变化响应,灵活性高,支持异步通信和多线程编程。
  • 信号是单调的,而事件是丰富的。
2.事件系统QEvent
  • GUI(Graphical User Interface) 应用程序是由事件(event)驱动的,点击鼠标、按下某个按键、改变窗口大小、最小化窗口等都会产生相应的事件,应用程序对这些事件进行相应的处理以实现程序的功能。
  • 在大多数情况下,GUI进程和UI进程这两个术语是可以互换使用的,它们通常指的是同一个概念,即处理和管理图形用户界面(Graphical User Interface, GUI)以及用户与应用程序交互的进程。
  • 代码详解
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);
//QApplication类是Qt应用程序的核心,负责管理应用程序的控制流和主要设置。
通过构造函数QApplication::QApplication(int &argc, char **argv)创建
一个QApplication对象。这个对象初始化应用程序的环境,并且启动事件循环。Widget w;w.show();
//Widget w;创建一个名为w的Widget对象(假设Widget是自定义的窗口类,继承自QWidget或其子类)。
w.show();调用QWidget的show()方法,使窗口显示在屏幕上。显示窗口后,QWidget开始接收和处理事件。return a.exec();//a.exec()启动Qt的主事件循环。这是一个阻塞调用,直到应用程序退出(通常是通过调用QApplication::quit()或窗口关闭事件)。
在事件循环中,QApplication会持续监控事件队列,等待并处理各种事件,如鼠标点击、键盘输入、窗口重绘请求等。
}
3. 事件过滤器
  • 事件过滤器。它可以将一个对象的事件委托给另一个对象来监视并处理。例如,一个窗口可以作为其界面上的QLabel组件的事件过滤器,派发给QLabel 组件的事件由窗口去处理,这样,就不需要为了处理某种事件而新定义一个标签类。
  • 要实现事件过滤器功能,需要完成两项操作。
    - 被监视对象使用函数installEventFilter()将自己注册给监视对象,监视对象就是事件过滤器。
    - 监视对象重新实现函数eventFilter(),对监视到的事件进行处理。作为事件过滤器的监视对象需要重新实现函数eventFilter()
  • 事件过滤器可以在事件到达目标对象之前进行预处理,从而提供了更多的控制和灵活性。
  • 主要作用和使用场景
    1. 事件拦截和预处理
    - 检查修改事件:在事件到达目标对象之前检查和修改事件。例如,可以在事件到达目标对象之前记录事件信息、修改事件数据或阻止事件的进一步传播。
    - 实现自定义逻辑:在事件到达目标对象之前实现自定义逻辑。例如,可以在鼠标点击之前判断是否允许特定操作,或者在键盘输入之前进行输入验证。
    2. 统一处理多个对象的事件
    - 事件过滤器允许你统一处理多个对象的事件,而不需要在每个对象上实现事件处理函数。这对于管理复杂界面中的多个控件特别有用。
    - 集中处理事件:将事件处理逻辑集中到一个地方(即事件过滤器),而不是在每个控件的事件处理函数中实现。
    - 简化代码:减少代码重复,使代码更清晰、易于维护。
    3. 实现复杂的事件处理逻辑
    - 拦截阻止事件:根据需要阻止事件的进一步传播。例如,可以阻止鼠标事件在控件之间传播,或者阻止特定的键盘输入。
    - 实现全局事件处理:在整个应用程序中实现全局事件处理逻辑,例如处理所有控件的鼠标点击事件。
    4. 使用场景
    - 自定义控件行为:修改控件的默认行为,例如在按钮上添加额外的点击处理逻辑。
    - 事件监控:记录或调试事件,例如记录所有鼠标点击事件的位置和类型。
    - 跨控件事件处理:在一个地方集中处理多个控件的事件,例如处理所有按钮的点击事件。
4. 代码举例
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget> // 包含QWidget类的定义QT_BEGIN_NAMESPACE
namespace Ui { class Widget; } // 声明Qt UI命名空间
QT_END_NAMESPACE// Widget类定义,继承自QWidget
class Widget : public QWidget
{Q_OBJECT // Qt的Meta-Object系统宏,用于支持信号和槽机制public:// 构造函数,接受一个可选的父窗口指针Widget(QWidget *parent = nullptr);// 析构函数~Widget();// 事件过滤器重写函数// 用于拦截并处理对象的事件bool eventFilter(QObject *watched, QEvent *event) override;public slots:
//信号槽函数void btnClickedSlotFun();private:// UI指针,指向自动生成的UI类Ui::Widget *ui;
};#endif // WIDGET_H//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMouseEvent>Widget::Widget(QWidget *parent): QWidget(parent)         // 调用基类QWidget的构造函数, ui(new Ui::Widget)      // 初始化UI指针
{ui->setupUi(this);        // 设置UI组件// 安装事件过滤器到不同的UI组件ui->label->installEventFilter(this);     // 监控ui->label的事件ui->btn->installEventFilter(this);       // 监控ui->btn的事件ui->labHover->installEventFilter(this);  // 监控ui->labHover的事件ui->labDBClick->installEventFilter(this); // 监控ui->labDBClick的事件connect(ui->btn,SIGNAL(clicked()),this,SLOT(btnClickedSlotFun()));
}Widget::~Widget()
{delete ui;   // 释放UI指针的内存
}bool Widget::eventFilter(QObject *watched, QEvent *event)
{// 处理ui->label的事件if (watched == ui->label) {if (event->type() == QEvent::MouseButtonPress) {QMouseEvent *ev = static_cast<QMouseEvent *>(event); // 转换为QMouseEvent类型qDebug() << "label press" << ev->button() << "x=" << ev->x() << "y=" << ev->y(); // 输出鼠标点击信息} else if (event->type() == QEvent::Enter) {qDebug() << "label enter"; // 输出鼠标进入事件} else if (event->type() == QEvent::Leave) {qDebug() << "label leave"; // 输出鼠标离开事件}}// 处理ui->btn的事件else if (watched == ui->btn) {if (event->type() == QEvent::Enter) {static int a = 1; // 用于更新计数器ui->lineEdit->setText(QString("zhangsan = %1").arg(a++)); // 更新lineEdit的文本qDebug() << "btn enter"; // 输出鼠标进入事件} else if (event->type() == QEvent::Leave) {qDebug() << "btn leave"; // 输出鼠标离开事件}}// 处理ui->labHover的事件else if (watched == ui->labHover) {if (event->type() == QEvent::Enter) {ui->labHover->setStyleSheet("background-color: rgb(170, 255, 255);"); // 鼠标进入时改变背景颜色} else if (event->type() == QEvent::Leave) {ui->labHover->setStyleSheet(""); // 鼠标离开时恢复背景颜色ui->labHover->setText("靠近我,点击我"); // 恢复标签文本} else if (event->type() == QEvent::MouseButtonPress) {ui->labHover->setText("button pressed"); // 鼠标按下时更新标签文本} else if (event->type() == QEvent::MouseButtonRelease) {ui->labHover->setText("button released"); // 鼠标释放时更新标签文本}}// 处理ui->labDBClick的事件else if (watched == ui->labDBClick) {if (event->type() == QEvent::Enter) {ui->labDBClick->setStyleSheet("background-color: rgb(85, 255, 127);"); // 鼠标进入时改变背景颜色} else if (event->type() == QEvent::Leave) {ui->labDBClick->setStyleSheet(""); // 鼠标离开时恢复背景颜色ui->labDBClick->setText("可双击的标签"); // 恢复标签文本} else if (event->type() == QEvent::MouseButtonDblClick) {ui->labDBClick->setText("double clicked"); // 鼠标双击时更新标签文本}}// 调用基类的eventFilter方法,允许事件继续传播return QWidget::eventFilter(watched, event);
}void Widget::btnClickedSlotFun()
{static int c = 1;qDebug()<<"c = "<<c;
}

在这里插入图片描述

5. QT事件类型

Qt事件类型

事件类事件类型事件描述
QMouseEventQEvent::MouseButtonDblClick鼠标双击
QEvent::MouseButtonPress鼠标按键按下,可以是左键或右键
QEvent::MouseButtonRelease鼠标按键释放,可以是左键或右键
QEvent::MouseMove鼠标移动
QWheelEventQEvent::Wheel鼠标滚轮滚动
QHoverEventQEvent::HoverEnter鼠标光标移动到组件上方并悬停(hover)
QEvent::HoverLeave鼠标光标离开某个组件上方
QEvent::HoverMove鼠标光标在组件上方移动
QEnterEventQEvent::Enter鼠标光标进入组件或窗口边界范围内
QEventQEvent::Leave鼠标光标离开组件或窗口边界范围
QKeyEventQEvent::KeyPress键盘按键按下
QEvent::KeyRelease键盘按键释放
QFocusEventQEvent::FocusIn组件或窗口获得键盘的输入焦点
QEvent::FocusOut组件或窗口失去键盘的输入焦点
QEvent::FocusAboutToChange组件或窗口的键盘输入焦点即将变化
QShowEventQEvent::Show窗口在屏幕上显示出来,或组件变得可见
QHideEventQEvent::Hide窗口在屏幕上隐藏(例如窗口最小化),或组件变得不可见
QMoveEventQEvent::Move组件或窗口的位置移动
QCloseEventQEvent::Close窗口被关闭,或组件被关闭,例如QTabWidget的一个页面被关闭
QPaintEventQEvent::Paint界面组件需要更新重绘
QResizeEventQEvent::Resize窗口或组件改变大小
QStatusTipEventQEvent::StatusTip请求显示组件的statusTip信息
QHelpEventQEvent::ToolTip请求显示组件的toolTip信息
QEvent::WhatsThis请求显示组件的whatsThis信息
QDragEnterEventQEvent::DragEnter在拖放操作中,鼠标光标移动到组件上方
QDragLeaveEventQEvent::DragLeave在拖放操作中,鼠标光标离开了组件
QDragMoveEventQEvent::DragMove拖放操作正在移动过程中
QDropEventQEvent::Drop拖放操作完成,即放下拖动的对象
QTouchEventQEvent::TouchBegin开始一个触屏事件序列(sequence)
QEvent::TouchCancel取消一个触屏事件序列
QEvent::TouchEnd结束一个触屏事件序列
QEvent::TouchUpdate触屏事件
QGestureEventQEvent::Gesture手势事件,能识别的手势有轻触、放大、扫屏等
QNativeGestureEventQEvent::NativeGesture操作系统检测到手势而产生的事件
QActionEventQEvent::ActionAdded运行QWidget::addAction()函数时会产生这种事件
QEvent::ActionChangedAction改变时触发的事件
QEvent::ActionRemoved移除Action时触发的事件

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

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

相关文章

中国 X86 CPU 技术源自何方

注&#xff1a; 原文发布于 2017 年&#xff0c;两篇合二为一。未与作者沟通&#xff0c;侵权&#xff0c;立删。 导语&#xff1a; Intel 对 X86 的授权有着极为严格的限制&#xff0c;那么上海兆芯的 X86 芯片技术到底从何而来&#xff1f;ZX-C 目前的短板在哪里&#xff1f;…

pytorch 46 将ASpanFormer模型导出onnx运行

ASpanFormer是一个2022年8月份发布的算法,其主要步骤与LoFTR模型类似,因此无法导出为onnx模型。根据ASpanFormer论文中的数据与效果图,可以确定AsPanFormer是可以作为一个比SP+SG更为有效的方案,其在标准数据集上的效果优于SP+SG,在速度上远超SP+SG,与LoFTR接近;在预测点…

【深度学习入门项目】多层感知器(MLP)实现手写数字识别

多层感知器&#xff08;MLP&#xff09;实现手写数字识别 导入必要的包获得软件包的版本信息 下载并可视化数据查看一个batch的数据查看图片细节信息设置随机种子 定义模型架构Build model_1Build model_2 Train the Network (30 marks)Train model_1Train model_1Visualize th…

AI+X活动开放报名!Datawhale来南京了

Datawhale线下 主办方&#xff1a;讯飞开放平台、Datawhale、GDG南京 AIX 主题活动今年将走进 10 个城市&#xff0c;100 所高校&#xff0c;目前已经走进32所高校&#xff0c;以及北京、深圳、上海、杭州、武汉五个城市&#xff0c;南京是第六个城市&#xff0c;时间7月27号。…

IP-Trunk简介

定义 IP-Trunk是将多个链路层协议为HDLC的POS接口捆绑到一起&#xff0c;形成一条逻辑上的数据链路&#xff0c;以提供更高的连接可靠性和更大的带宽&#xff0c;实现流量负载分担。 目的 POS是一种应用在城域网及广域网中的技术&#xff0c;利用SONET/SDH提供的高速传输通道…

html改写vue日志

本人最近学了vue&#xff0c;想着练手的方法就是改写之前在公司开发的小系统前端&#xff0c;将前端的AJAXJSThymeleaf改为axiosvue。 改写html 将<html>中的<head>和<body>结构移除&#xff0c;将css部分移入<style>&#xff0c; 重新定义了全局的&…

视频汇聚,GB28181,rtsp,rtmp,sip,webrtc,视频点播等多元异构视频融合,视频通话,视频会议交互方案

现在视频汇聚&#xff0c;视频融合和视频互动&#xff0c;是视频技术的应用方向&#xff0c;目前客户一般有很多视频的业务系统&#xff0c;如已有GB28181的监控&#xff08;GB现在是国内主流&#xff0c;大量开源接入和商用方案&#xff09;&#xff0c;rtsp设备&#xff0c;音…

科研绘图系列:R语言单细胞聚类气泡图(single cell bubble)

介绍 单细胞的标记基因气泡图是一种用于展示单细胞数据中特定基因表达情况的可视化方法。它通常用于展示细胞亚群中标记基因的表达水平,帮助研究者识别和区分不同的细胞类型。在这种图表中,每个细胞亚群用不同的颜色表示,而基因表达水平则通过气泡的大小来表示,从而直观地…

【IEEE出版,会议历史良好、论文录用检索快】第四届计算机科学与区块链国际学术会议 (CCSB 2024,9月6-8)

CCSB 2024会议由深圳大学主办&#xff0c;旨在探讨计算机科学的最新发展如何与区块链技术相结合&#xff0c;以及这一结合如何推动金融、供应链管理、数据安全和其他多个行业的革新&#xff0c; 本次会议将提供一个多学科交流的平台&#xff0c;汇集来自相关领域学者的研究和思…

最优化理论与方法-第十讲-对偶理论的基本性质和割平面法

文章目录 1. 向量化拉格朗日对偶函数2. 对偶问题是凹函数3. 对偶问题转换4. 外逼近法4.1 步骤4.2 注意事项 1. 向量化拉格朗日对偶函数 ( D ) max ⁡ d ( λ , μ ) s t . λ i ≥ 0 , i 1 , ⋯ , m , d ( λ , μ ) min ⁡ x ∈ X { f ( x ) ∑ i 1 m λ i g i ( x ) ∑ …

【AI那些事】YOLO算法在香橙派AIpro上跑起来的初体验

一、本文概述 在之前推出的Yolo算法后&#xff0c;我在windows电脑上使用python语言运行将其跑通了&#xff0c;觉的这个识别算法很是有意思&#xff0c;就一直想着这个算法能不能跑在硬件的开发板上那就太好了。我就开始寻找市面上可行的开发板&#xff0c;一直期盼的事情真的…

【学术研究、研究热点、最新前沿】如何跟踪最新的论文

1.跟踪arxiv 使用https://www.arxivdaily.com/接收每天的推送。 2.跟踪热点文章的引用 使用semantic scholar。 3.跟踪某个学术大佬或者主题 3.1 使用web of science。 3.2 使用文献鸟 4.跟踪某个期刊

迭代学习笔记

一、迭代学习定义和分类 1、直观理解 迭代学习一般应用于重复性的场景。比如控制一个单自由度的小车以特定的速度曲线移动到指定位置&#xff0c;整个时间是10s&#xff0c;控制频率是0.01&#xff0c;那么整个控制序列就会有1000个点。这1000个点在10s内依次发出&#xff0c…

小白快速入门量化交易的自学路径

今年已然过去一半了&#xff0c;年初立的flag都实现了吗&#xff1f; 据我多年来的观察&#xff0c;很多小白萌新开始学习量化&#xff0c;特别是年初的时候立下“宏图大志”&#xff0c;但有相当一部分最终没能"上岸"&#xff0c;从入门到放弃&#xff0c;从然后到没…

抽象java入门1.5.2

前言&#xff1a; 坑留下来是为了补的 正片&#xff1a; 一、面向对象特性 二、面向对象编程详细展开 这些没有加粗的方法究竟来源哪&#xff1f; 在上一期的提示中&#xff0c;我们说了这些方法来源于面向对象编程的一个特性 验证&#xff1a; 第一步&#xff1a;我们先…

代码随想录算法训练营第23天|39. 组合总和、40.组合总和II、131.分割回文串

打卡Day23 1.39. 组合总和2.40.组合总和II3.131.分割回文串 1.39. 组合总和 题目链接&#xff1a;39. 组合总和 文档讲解&#xff1a; 代码随想录 这道题和昨天做的组合之和由两个区别&#xff1a;被选的元素没有数量限制&#xff0c;同时被选的元素可以无限重复&#xff0c;…

JavaScript:节流与防抖

目录 一、前言 二、节流&#xff08;Throttle&#xff09; 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装节流函数 三、防抖&#xff08;Debounce&#xff09; 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装防抖函数 四、异同点总结 一、前言 …

Adobe Premiere Pro(Pr)安装包软件下载

一、简介 Adobe Premiere Pro&#xff08;简称Pr&#xff09;是由Adobe公司开发的一款功能强大的视频编辑软件。它支持多平台使用&#xff0c;包括Windows和Mac系统&#xff0c;并且拥有良好的兼容性和高效的性能。Premiere Pro不仅提供了视频剪辑、特效添加、音频处理等基本功…

《从C/C++到Java入门指南》- 9.字符和字符串

字符和字符串 字符类型 Java 中一个字符保存一个Unicode字符&#xff0c;所以一个中文和一个英文字母都占用两个字节。 // 计算1 .. 100 public class Hello {public static void main(String[] args) {char a A;char b 中;System.out.println(a);System.out.println(b)…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…