当前位置: 首页 > news >正文

Qt事件系统

第三章Qt事件系统

文章目录

  • 第三章Qt事件系统
  • 1.事件系统
    • 事件是如何传递的
    • 事件类型
    • 事件处理
    • 发送事件
  • 2.事件传播机制
    • 事件接受和忽略
    • 事件分发
    • 事件过滤
  • 3.事件和信号的区别

1.事件系统

在Qt中,事件是派生抽象QEvent类的对象,它表示应用程序内发生的事情,或应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理。
Qt程序需要在main函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始Qt的事件循环。执行后,程序将进入事件循环来监听应用程序的事件,当事件发生时,Qt将创建一个事件对象。

事件是如何传递的

通过
QCoreApplication::sendEvent()
发送事件
用户触发事件
操作系统接收
将事件分发给对应的应用程序
应用程序事件过滤器处理
nativeEventFilter()
通过
QCoreApplication::postEvent()
发送事件
事件队列
事件分发给对应控件
QApplication::notify()
控件事件过滤处理
QObject::eventFilter()
将事件进行分发
QObject::event()
控件处理
例如mousePressEvent()
忽略该事件
控件的父级处理

事件类型

#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中&#xff0c;事件是派生抽象QEvent类的对象&#xff0c;它表示应用程序内发生的事情&am…...

C++STL--排序算法

sort 使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。 sort(v.begin(),v.end());//对v容器进行排序,默认升序 sort(v.begin(),v.end(),greater<int>());//降序排序对于支持随机访问的迭代器的容器&#xff0c; 都可以利用sort算法直接对其进行排序…...

CEF的了解

(14 封私信 / 80 条消息) CEF和Electron的区别是什么&#xff1f; - 知乎 (zhihu.com) Electron面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;不会C CEF面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;会C (14 封私信 / 80 条消息) liulun - …...

基于OrangePi Zero2的智能家居项目(开发阶段)

智能家居项目的软件实现 紧接上文 基于OrangePi Zero2的智能家居项目&#xff08;准备阶段&#xff09;-CSDN博客 目录 一、项目整体设计 1.1项目整体设计 1.2具体划分 二、开发工作的前期准备 1、进行分类&#xff0c;并用Makefile文件进行管理 参考&#xff1a;自己创…...

数据结构记录

之前记录的数据结构笔记&#xff0c;不过图片显示不了了 数据结构与算法(C版) 1、绪论 1.1、数据结构的研究内容 一般应用步骤&#xff1a;分析问题&#xff0c;提取操作对象&#xff0c;分析操作对象之间的关系&#xff0c;建立数学模型。 1.2、基本概念和术语 数据&…...

从零到一:基于 K3s 快速搭建本地化 kubeflow AI 机器学习平台

背景 Kubeflow 是一种开源的 Kubernetes 原生框架&#xff0c;可用于开发、管理和运行机器学习工作负载&#xff0c;支持诸如 PyTorch、TensorFlow 等众多优秀的机器学习框架&#xff0c;本文介绍如何在 Mac 上搭建本地化的 kubeflow 机器学习平台。 注意&#xff1a;本文以 …...

kettle使用MD5加密增量获取接口数据

kettle使用MD5加密增量获取接口数据 场景介绍&#xff1a; 使用JavaScript组件进行MD5加密得到Http header&#xff0c;调用API接口增量获取接口数据&#xff0c;使用json input组件解析数据入库 案例适用范围&#xff1a; MD5加密可参考、增量过程可参考、调用API接口获取…...

PS入门|黑白色的图标怎么抠成透明背景

前言 抠图可以算是PS的入门必备操作&#xff0c;开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦&#xff01;但切勿心急&#xff5e; 今天给小伙伴们带来&#xff1a;黑白色的图标抠图教程 抠图有很多种方法&#xff0c;但根据类型的不同&#xff0c;使用适当的方法很重…...

android 14 apexd分析(2)apexd 启动

1. class main进程一起启动&#xff0c; apexservice是他提供的binderservice&#xff0c;这也第二阶段的最主要的作用 /system/apex/apexd/apexd.rc?r3c8e8603c640fc41e0406ddcf981381803447cfb#1 1 service apexd /system/bin/apexd 2 interface aidl apexservice …...

微信小程序怎么制作?制作一个微信小程序需要多少钱?

随着移动互联网的快速发展&#xff0c;微信小程序已成为连接用户与服务的重要桥梁。它以其便捷性和易用性&#xff0c;为各类企业和个人提供了一个全新的展示和交易平台。那么&#xff0c;如何制作一个微信小程序&#xff1f;又需要投入多少资金呢&#xff1f;本文将为您提供全…...

WPS二次开发专题:如何获取应用签名SHA256值

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请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&#xff08;Windows Presentation Foundation&#xff09;是.NET框架的一个组成部分&#xff0c;用于构建桌面应用程序的用户界面。ListBox是WPF中一个非常常用的控件&#xff0c;用于显示一系列的项&#xff0c;用户可以选择单个或多个项。 1.ListBox的基本概念 ListBox…...

Chatgpt掘金之旅—有爱AI商业实战篇(二)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、前言&#xff1a; 成为一名商业作者是一个蕴含着无限可能的职业选择。在当下数字化的时代&#xff0c;作家们有着众多的平台可以展示和推广自己的作品。无论您是对写书、文…...

AGI时代,LLM可以在AutoML哪些环节进行增强?

当下大模型技术发展如火如荼&#xff0c;颇有改变各行业和各领域的架势。那么对于AutoML来讲&#xff0c;LLM对其有哪些助力&#xff1f;对于这个问题&#xff0c;我们来问一问kimi chat&#xff0c;看看它怎么回答&#xff1f; 大型语言模型&#xff08;LLM&#xff09;可以在…...

算法练习—day1

title: 算法练习—day1 date: 2024-04-03 21:49:55 tags: 算法 categories:LeetCode typora-root-url: 算法练习—day1 网址&#xff1a;https://red568.github.io 704. 二分查找 题目&#xff1a; 题目分析&#xff1a; 左右指针分别为[left,right]&#xff0c;每次都取中…...

关于ansible的模块 ③

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 接《关于Ansible的模块①》和《关于Ansible的模块②》&#xff0c;继续学习ansible的user模块。 user模块可以增、删、改linux远…...

Spring Boot--文件上传和下载

文件上传和下载 前言文件上传1、以MultipartFile 接口流文件&#xff0c;流的名称需要和前台传过来的名称对应上2、获取到文件名称截取后缀3、为了放置文件名重复使用uuid来随机生成id后缀4、判断转存路径中是否有这个文件夹如果没有就创建5、将文件存储到转存的目录中 文件下载…...

hexo博客7:构建简单的多层安全防御体系

【hexo博客7】构建简单的多层安全防御体系 写在最前面理解全面安全策略的重要性防御常见的网络攻击1. SQL注入攻击2. 文件上传漏洞3. 跨站脚本攻击&#xff08;XSS&#xff09;4. 跨站请求伪造&#xff08;CSRF&#xff09;5. 目录遍历/本地文件包含&#xff08;LFI/RFI&#x…...

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha&#xff0c;在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中&#xff0c;搜索movie render &#xff0c;加载movie render q…...

(免费分享)基于微信小程序自助停取车收费系统

本项目的开发和制作主要采用Java语言编写&#xff0c;SpringBoot作为项目的后端开发框架&#xff0c;vue作为前端的快速开发框架&#xff0c;主要基于ES5的语法&#xff0c;客户端采用微信小程序作为开发。Mysql8.0作为数据库的持久化存储。 获取完整源码&#xff1a; 大家点赞…...

Vue3_2024_7天【回顾上篇watch常见的后两种场景】___续

Vue3中监听多条数据的两种使用 1.watch【使用上一章写法&#xff0c;监听两个属性&#xff0c;然后执行相应操作…】 2.watchEffect【相对于使用watch&#xff0c;watchEffect默认页面初始加载&#xff0c;有点类似加配置&#xff1a;立即执行 immediate】 代码&#xff1a; …...

Gemini即将收费,GPT无需注册?GPT3.5白嫖和升级教程

&#x1f310;Gemini 即将开始收费 开发者“白嫖”的好日子到头了 - Gemini将开始收费&#xff0c;影响使用Google AI for Developers提供的Gemini API的用户。 - Gemini API将引入按量付费定价&#xff0c;需要注意新的服务条款。 - 用户需在5月2日之前停止使用Gemini API和Go…...

【协议篇:Http与Https】

1. Http 1.1 Http的定义 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是用于分布式、协作式和超媒体信息系统的应用层协议。它是互联网上最广泛应用的数据通信协议之一&#xff0c;尤其对于万维网&#xff08;WWW&#xff09;服务而言…...

WPS二次开发系列:WPS SDK初始化

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 本文将详细介绍WPS SDK初始化&#xff0c;帮您能够更…...

EXCEL地理数据处理工具(地图任务)

版本号 作者 修订内容 发布日期 1.0 小O 更新至0705版 2022-4-28 1.1 小O 更新至0772版 2024年4月3日 一、概述 小O地图EXCEL插件版提供基于EXCEL表格进行地理数据处理、地图可视化、地图绘图等功能&#xff0c;地理工具是用户使用频率很高的功能模块。地理工具能…...

软件设计原则:迪米特法则

定义 迪米特法则&#xff08;Law of Demeter, LoD&#xff09;&#xff0c;又称最少知识原则&#xff0c;它指导我们在设计软件时&#xff0c;应当尽量减少对象之间的交互&#xff0c;一个对象应该对其他对象有尽可能少的了解。具体来说&#xff0c;一个对象应该只调用属于以下…...

MongoDB聚合运算符:$max

文章目录 语法使用空值和缺失值的处理数组操作数的处理 举例在$group阶段使用在$setWindowFields阶段使用在$project阶段使用 $max聚合运算符用于返回最大值。 $max对于不同的类型的值使用BSON的比较顺序。 $max可以用于下面的这些阶段&#xff1a; $addFields$bucket$bucket…...

神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT

系列文章目录 参考博客1 参考博客2 文章目录 系列文章目录前言一、RNN1、简介2、模型结构3、RNN公式分析4、RNN的优缺点及优化1&#xff09;LSTM是RNN的优化结构2&#xff09;GRU是LSTM的简化结构 二、ELMo1、简介2、模型结构1&#xff09;输入2&#xff09;左右双向上下文信…...

Java23种设计模式

本文主要是对Java中一些常用的设计模式进行讲解 后期会进行不断的更新&#xff0c;欢迎浏览 23种设计模式 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、桥接…...

网站建设收徒弟/官网seo

https://www.jianshu.com/p/2eb53fa87219...

广州建设局网站首页/360站长平台链接提交

python3 操作excel 更多干货 分布式实战&#xff08;干货&#xff09;spring cloud 实战&#xff08;干货&#xff09;mybatis 实战&#xff08;干货&#xff09;spring boot 实战&#xff08;干货&#xff09;React 入门实战&#xff08;干货&#xff09;构建中小型互联网企业…...

网站栏目做树形结构图/重庆seowhy整站优化

Docker的C/S模式&#xff1a; 用户通过Docker的CLI客户端向Docker守护进程发送指令&#xff0c;然后Docker守护进程将执行结果通过Docker的CLI客户端显示给用户。 Docker也提供了与守护进程通信的API&#xff0c;叫做RemoteAPI。RemoteAPI在复杂的情况下支持使用STDIN/STDOUT/S…...

西安网站建设首选/优化系统的软件

原标题&#xff1a;「数控干货」基于UG CLS文件使用 C 语言制作智能后处理工具1 前言UG 后处理操作是 UGCAM 数控加工工作中一个重要环节&#xff0c;主要任务是把在 UG 加工环境下生成的加工刀位文件转换成机床可接受的数控代码文件。UG 本身提供了强大的 Post Builder 后处理…...

做背景图获取网站/附子seo教程

【杠精学物理】第267篇原创文章。今天视频要讲的是一个高考中常见的问题——欧姆表的误差分析(当电源电动势降低&#xff0c;内阻增大时&#xff0c;测量值与真实值差异问题)。问题来源于前两天看到学生群里的讨论&#xff0c;感觉同学们越辩越糊涂。在此录制一个视频&#xff…...

网站维护费计入什么科目/搜索量排名

2019独角兽企业重金招聘Python工程师标准>>> 1. 系统日志 tail -f /var/log/messages Apr 18 11:21:56 web5 kernel: possible SYN flooding on port 80. Sending cookies. 2.检查连接数 netstat -n | awk /^tcp/ {S[$NF]} END {for(a in S) print a, S[a]} TIME_W…...