Qt事件系统
第三章Qt事件系统
文章目录
- 第三章Qt事件系统
- 1.事件系统
- 事件是如何传递的
- 事件类型
- 事件处理
- 发送事件
- 2.事件传播机制
- 事件接受和忽略
- 事件分发
- 事件过滤
- 3.事件和信号的区别
1.事件系统
在Qt中,事件是派生抽象QEvent类的对象,它表示应用程序内发生的事情,或应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理。
Qt程序需要在main函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始Qt的事件循环。执行后,程序将进入事件循环来监听应用程序的事件,当事件发生时,Qt将创建一个事件对象。
事件是如何传递的
事件类型
#include <QWidget>
#include <QMouseEvent>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected://鼠标事件void mouseDoubleClickEvent(QMouseEvent *)override;void mousePressEvent(QMouseEvent *)override;void mouseReleaseEvent(QMouseEvent *)override;void mouseMoveEvent(QMouseEvent *)override;//按键事件void keyPressEvent(QKeyEvent *)override;void keyReleaseEvent(QKeyEvent * )override;//窗口事件void closeEvent(QCloseEvent *) override;void hideEvent(QHideEvent *)override;void resizeEvent(QResizeEvent *)override;//焦点事件void focusInEvent(QFocusEvent*)override;void focusOutEvent(QFocusEvent*)override ;void contextMenuEvent(QContextMenuEvent*)override;//程序状态改变事件void changeEvent(QEvent*)override;//定时器事件void timerEvent(QTimerEvent*)override;
};
事件处理
#include "Widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{this->setMouseTracking(false);//启用鼠标追踪this->setFocus();new QPushButton("按钮",this);this->startTimer(10);//10毫秒
}Widget::~Widget() {}void Widget::mouseDoubleClickEvent(QMouseEvent *)
{qInfo()<<"鼠标双击";
}void Widget::mousePressEvent(QMouseEvent *)
{qInfo()<<"鼠标按下";
}void Widget::mouseReleaseEvent(QMouseEvent *)
{qInfo()<<"鼠标释放";
}void Widget::mouseMoveEvent(QMouseEvent *)
{static int16_t i=0;qInfo()<<"鼠标移动"<<i++;
}void Widget::keyPressEvent(QKeyEvent *event)
{qInfo()<<event->text()<<"按键已按下";
}void Widget::keyReleaseEvent(QKeyEvent *event)
{auto k=event->key();qInfo()<<k<<"按键已弹起";
}void Widget::closeEvent(QCloseEvent *)
{qInfo()<<"窗口关闭";
}void Widget::hideEvent(QHideEvent *)
{qInfo()<<"窗口隐藏";
}void Widget::resizeEvent(QResizeEvent *)
{qInfo()<<"窗口大小改变";
}void Widget::focusInEvent(QFocusEvent *)
{qInfo("有焦点");
}void Widget::focusOutEvent(QFocusEvent *)
{qInfo("失去焦点");
}void Widget::contextMenuEvent(QContextMenuEvent *)
{qInfo()<<"收到信号,弹出菜单";
}void Widget::changeEvent(QEvent *e)
{if(e->type()==QEvent::WindowStateChange)qInfo()<<"发生改变";
}void Widget::timerEvent(QTimerEvent *)
{static qint32 x=0,y = 0;this->move(x++%600+500,y++%800);
}
bool event(QEvent *event) override;bool Widget::event(QEvent *event)
{if(event->type()==QEvent::Type::MouseButtonPress)return true;//屏蔽了MouseButtonPress事件return QWidget::event(event); //把事件交给父类处理
}
发送事件
- 自定义事件
#include <QWidget>
#include <QMouseEvent>
#include <QEvent>class MyCustomEvent:public QEvent
{
public:MyCustomEvent():QEvent(QEvent::Type::User){info = "自定义事件";}QString getMessage(){return info;}
private:QString info;
};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);
protected://鼠标事件void mousePressEvent(QMouseEvent *)override;//自定义事件void customEvent(QEvent *event)override;};Widget::Widget(QWidget *parent): QWidget(parent)
{resize(640,480);
}void Widget::mousePressEvent(QMouseEvent *)
{qInfo()<<"鼠标按下";MyCustomEvent* ce = new MyCustomEvent;qApp->sendEvent(this,ce);
}void Widget::customEvent(QEvent *event)
{if(event->type()==QEvent::User){auto ce = dynamic_cast<MyCustomEvent*>(event);if(!ce)return;qInfo()<<ce->getMessage();}
}
- sendEvent和postEvent的区别
sendEvent 事件发送后,事件不会被删除,是分配在栈上的
postEvent 事件必须在堆上分配,事件发布后会被删除,事件按优先级降序排列。
2.事件传播机制
事件接受和忽略
QEvent()有accept()和ignore()函数
accept,本组处理该事件,不会被传递
ignore,不处理,交给父处理
事件分发
事件过滤
用事件过滤器实现鼠标拖动无边框窗口案例
#include <QWidget>
#include <QMouseEvent>
#include <QEvent>
#include <QPushButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected://事件过滤处理器bool eventFilter(QObject *watched, QEvent *event)override;
private:QPoint pressPos;#include "Widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent)
{resize(640,480);setWindowFlag(Qt::FramelessWindowHint);//设置无边框installEventFilter(this);//在对象上安装事件过滤器,如果不装,过滤器重写无效
}Widget::~Widget() {}bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(watched==this){if(event->type()==QEvent::MouseButtonPress){auto me=dynamic_cast<QMouseEvent*>(event);pressPos = me->pos();return true;}else if(event->type()==QEvent::MouseMove){auto me=dynamic_cast<QMouseEvent*>(event);move(me->globalPosition().toPoint()-pressPos);//globalPosition是鼠标在全局的位置,pressPos是鼠标相对于窗口左上角的位置,两者一减,就是窗口左上角在全局的位置}elsereturn false;}elsereturn QObject::eventFilter(watched,event);
}};
3.事件和信号的区别
| 事件 | 信号 | |
|---|---|---|
| 与QObject的关系 | 由具体对象进行处理 | 由具体对象主动产生 |
| 对程序的影响 | 改写事件处理函数可能导致程序行为发生改变 | 信号是否存在对应的槽函数不会改变程序的行为 |
| 两者的联系 | 一般而言,信号在具体的事件处理函数中产生 |
信号和事件是两个不同层面的东西,发出者不同,作用不同。
相关文章:
Qt事件系统
第三章Qt事件系统 文章目录 第三章Qt事件系统1.事件系统事件是如何传递的事件类型事件处理发送事件 2.事件传播机制事件接受和忽略事件分发事件过滤 3.事件和信号的区别 1.事件系统 在Qt中,事件是派生抽象QEvent类的对象,它表示应用程序内发生的事情&am…...
C++STL--排序算法
sort 使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。 sort(v.begin(),v.end());//对v容器进行排序,默认升序 sort(v.begin(),v.end(),greater<int>());//降序排序对于支持随机访问的迭代器的容器, 都可以利用sort算法直接对其进行排序…...
CEF的了解
(14 封私信 / 80 条消息) CEF和Electron的区别是什么? - 知乎 (zhihu.com) Electron面向的开发者:会用JavaScript,HTML,CSS,不会C CEF面向的开发者:会用JavaScript,HTML,CSS,会C (14 封私信 / 80 条消息) liulun - …...
基于OrangePi Zero2的智能家居项目(开发阶段)
智能家居项目的软件实现 紧接上文 基于OrangePi Zero2的智能家居项目(准备阶段)-CSDN博客 目录 一、项目整体设计 1.1项目整体设计 1.2具体划分 二、开发工作的前期准备 1、进行分类,并用Makefile文件进行管理 参考:自己创…...
数据结构记录
之前记录的数据结构笔记,不过图片显示不了了 数据结构与算法(C版) 1、绪论 1.1、数据结构的研究内容 一般应用步骤:分析问题,提取操作对象,分析操作对象之间的关系,建立数学模型。 1.2、基本概念和术语 数据&…...
从零到一:基于 K3s 快速搭建本地化 kubeflow AI 机器学习平台
背景 Kubeflow 是一种开源的 Kubernetes 原生框架,可用于开发、管理和运行机器学习工作负载,支持诸如 PyTorch、TensorFlow 等众多优秀的机器学习框架,本文介绍如何在 Mac 上搭建本地化的 kubeflow 机器学习平台。 注意:本文以 …...
kettle使用MD5加密增量获取接口数据
kettle使用MD5加密增量获取接口数据 场景介绍: 使用JavaScript组件进行MD5加密得到Http header,调用API接口增量获取接口数据,使用json input组件解析数据入库 案例适用范围: MD5加密可参考、增量过程可参考、调用API接口获取…...
PS入门|黑白色的图标怎么抠成透明背景
前言 抠图可以算是PS的入门必备操作,开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦!但切勿心急~ 今天给小伙伴们带来:黑白色的图标抠图教程 抠图有很多种方法,但根据类型的不同,使用适当的方法很重…...
android 14 apexd分析(2)apexd 启动
1. class main进程一起启动, apexservice是他提供的binderservice,这也第二阶段的最主要的作用 /system/apex/apexd/apexd.rc?r3c8e8603c640fc41e0406ddcf981381803447cfb#1 1 service apexd /system/bin/apexd 2 interface aidl apexservice …...
微信小程序怎么制作?制作一个微信小程序需要多少钱?
随着移动互联网的快速发展,微信小程序已成为连接用户与服务的重要桥梁。它以其便捷性和易用性,为各类企业和个人提供了一个全新的展示和交易平台。那么,如何制作一个微信小程序?又需要投入多少资金呢?本文将为您提供全…...
WPS二次开发专题:如何获取应用签名SHA256值
作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 在申请WPS SDK授权版时候需要开发者提供应用包名和签…...
Flink SQL系列之:基于Flink SQL查询Topic中序列化的Debezium数据格式字段
Flink SQL系列之:基于Flink SQL查询Topic中序列化的Debezium数据格式字段 一、表结构二、查询Topic中表的数据三、反序列化字段一、表结构 CREATE TABLE IF NOT EXISTS record_rt (id decimal(20,0) COMMENT "主键",follow_entity_type <...
【WPF应用30】WPF中的ListBox控件详解
WPF(Windows Presentation Foundation)是.NET框架的一个组成部分,用于构建桌面应用程序的用户界面。ListBox是WPF中一个非常常用的控件,用于显示一系列的项,用户可以选择单个或多个项。 1.ListBox的基本概念 ListBox…...
Chatgpt掘金之旅—有爱AI商业实战篇(二)
演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、前言: 成为一名商业作者是一个蕴含着无限可能的职业选择。在当下数字化的时代,作家们有着众多的平台可以展示和推广自己的作品。无论您是对写书、文…...
AGI时代,LLM可以在AutoML哪些环节进行增强?
当下大模型技术发展如火如荼,颇有改变各行业和各领域的架势。那么对于AutoML来讲,LLM对其有哪些助力?对于这个问题,我们来问一问kimi chat,看看它怎么回答? 大型语言模型(LLM)可以在…...
算法练习—day1
title: 算法练习—day1 date: 2024-04-03 21:49:55 tags: 算法 categories:LeetCode typora-root-url: 算法练习—day1 网址:https://red568.github.io 704. 二分查找 题目: 题目分析: 左右指针分别为[left,right],每次都取中…...
关于ansible的模块 ③
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 接《关于Ansible的模块①》和《关于Ansible的模块②》,继续学习ansible的user模块。 user模块可以增、删、改linux远…...
Spring Boot--文件上传和下载
文件上传和下载 前言文件上传1、以MultipartFile 接口流文件,流的名称需要和前台传过来的名称对应上2、获取到文件名称截取后缀3、为了放置文件名重复使用uuid来随机生成id后缀4、判断转存路径中是否有这个文件夹如果没有就创建5、将文件存储到转存的目录中 文件下载…...
hexo博客7:构建简单的多层安全防御体系
【hexo博客7】构建简单的多层安全防御体系 写在最前面理解全面安全策略的重要性防御常见的网络攻击1. SQL注入攻击2. 文件上传漏洞3. 跨站脚本攻击(XSS)4. 跨站请求伪造(CSRF)5. 目录遍历/本地文件包含(LFI/RFI&#x…...
《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》
《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha,在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中,搜索movie render ,加载movie render q…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
