(三十)自定义事件

Qt mouseEvent学习整理 在《精通Qt4编程》的11章中,有这样一个关于eventFilter的例子,其中部分代码如下: bool Digital::eventFilter(QObject *target, QEvent *event) {     if (target == display) {         if (event->type() == QEvent::MouseBut 阅读详情

自主发送事件:

1、  阻塞型事件发送:

事件发送后需要等待事件处理完成

bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]

 

2、非阻塞型事件发送:

         事件发送后立即返回

         事件被发送到事件队列中等待处理

         voidQCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]

 

注意事项:

1、 sendEvent()中的事件对象的生命周期由Qt程序管理,支持栈事件对象与堆事件对象的发送

2、postEvent()中的事件对象的生命周期由Qt平台管理,只能发送堆事件对象,事件被处理后由Qt平台销毁

 

//Widget.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QtGui/QWidget>
#include <QPushButton>
 
class Widget : public QWidget
{
   Q_OBJECT
   
   QPushButton m_pushButton;
 
   void testSendEvent();
   void testPostEvent();
protected slots:
   void onButtonClicked();
public:
   Widget(QWidget *parent = 0);
   bool event(QEvent* evt);
   ~Widget();
};
 
#endif // WIDGET_H
 


 

//Widget.cpp


#include "Widget.h"
#include <QMouseEvent>
#include <QCoreApplication>
#include <QDebug>
 
Widget::Widget(QWidget *parent)
    :QWidget(parent)
{
   m_pushButton.setParent(this);                //指定父子关系
   m_pushButton.setText("Test");
 
   connect(&m_pushButton, SIGNAL(clicked()), this,SLOT(onButtonClicked()));      
}
//槽函数相当于是在事件处理函数内部调用的,槽函数执行完之前,事件处理函数未执行完毕,即当前事件对象正在被处理
void Widget::onButtonClicked()      
{
   // testSendEvent();
   testPostEvent();
}
 
void Widget::testSendEvent()
{//定义事件对象,对象类型为鼠标双击事件,事件地点在0,0处,左键触发,后面两个参数指定鼠标与键盘的状态位
   QMouseEvent dbcEvt(QEvent::MouseButtonDblClick, QPoint(0, 0),Qt::LeftButton, Qt::NoButton, Qt::NoModifier);
 
   qDebug() << "Before sendEvent()";
        
    QCoreApplication::sendEvent(this,&dbcEvt);                  //为阻塞式的
         //调用后的现象是为:下面的event()函数执行完毕后再打印的下面的"after sendevent",仿佛QCoreApplication::sendEvent函数直接调用了接收对象的event()函数
        
   qDebug() << "After sendEvent()";
}
 
void Widget::testPostEvent()
{                                                                                           
   QMouseEvent* dbcEvt = new QMouseEvent(QEvent::MouseButtonDblClick,QPoint(0, 0), Qt::LeftButton, Qt::NoButton, Qt::NoModifier);      //postEvent函数只能发送堆事件对象
 
   qDebug() << "Before postEvent()";
                  
    QCoreApplication::postEvent(this,dbcEvt);//非阻塞式,调用后的现象是,打印完下面的"after postEvent"后才能看到event()函数被执行,事件被发送到了事件队列,需要根据事件队列中事件顺序依次处理事件
 
   qDebug() << "After postEvent()";
}
 
bool Widget::event(QEvent* evt)
{
   if( evt->type() == QEvent::MouseButtonDblClick ) 
    {
       qDebug() << "event(): " << evt;       
    }
 
   return QWidget::event(evt);  
}       
        
Widget::~Widget()
{
   
}



自定义事件

意图自定义的事件类:

1、自定义的事件类必须继承自QEvent

2、自定义的事件类必须拥有全局唯一的Type值

3、程序中必须提供处理自定义事件对象的方法

 

步骤:

1、将QEvent作为父类继承

2、指定全局唯一的Type值

class XXXEvent : public QEvent                           //自定义的事件类必须继承自QEvent类
{
   QString m_data;
public:
//自定义事件类必须拥有全局唯一的事件Type值,且需使用QEvent::User之后的值
const staticType TYPE = static_cast<Type>(QEvent::User + 0xFF);       
 
       //…..                 
};


 

3、处理自定义事件的常用方法

1)、给目标对象安装事件过滤器,在eventFilter()函数中编写自定义事件处理逻辑

2)、在目标对象类中重写event(),在event()函数中编写自定义事件的处理逻辑

事件的Type值:

1、每个Qt事件类都拥有全局唯一的Type值

2、自定义的事件类的Type值需要自定义

3、自定义事件类使用QEvent::User之后的值作为Type值,QEvent::User+ Value

4、需要保证应用程序中的自定义事件类的Type值:QEvent::User + Value全局唯一

 

//StringEvent.h

 

#ifndef _STRINGEVENT_H_
#define _STRINGEVENT_H_
 
#include <QEvent>
#include <QString>
 
class StringEvent : public QEvent                       //自定义的事件类必须继承自QEvent类
{
   QString m_data;
public:
//自定义事件类必须拥有全局唯一的事件Type值,自定义事件需使用QEvent::User之后的值
   const static Type TYPE = static_cast<Type>(QEvent::User + 0xFF);       
                                                                                                                                                                       
   explicit StringEvent(QString data = "");           
   QString data();                  
   
};
 
#endif // _STRINGEVENT_H_
 
// StringEvent.cpp
 
#include "StringEvent.h"
 
StringEvent::StringEvent(QString data) :QEvent(TYPE)
{                                                      
   m_data = data;
}
 
QString StringEvent::data()
{
   return m_data;
}
 
//Widget.h
#ifndef WIDGET_H
#define WIDGET_H
 
#include <QtGui/QWidget>
#include <QLineEdit>
 
class Widget : public QWidget
{
   Q_OBJECT
   
   QLineEdit m_edit;
public:
   Widget(QWidget *parent = 0);
   bool event(QEvent* evt);                                                       
   bool eventFilter(QObject* obj, QEvent* evt);
   ~Widget();
};
 
#endif // WIDGET_H


 

//Widget.cpp


#include "Widget.h"
#include "StringEvent.h"
#include <QMouseEvent>
#include <QDebug>
#include <QCoreApplication>
 
Widget::Widget(QWidget *parent)
    :QWidget(parent), m_edit(this)
{
   m_edit.installEventFilter(this);       
}
         //方法一: 重写目标对象的event()函数
bool Widget::event(QEvent* evt)
{
   if( evt->type() == QMouseEvent::MouseButtonDblClick )      
    {
       qDebug() << "event: Before sentEvent";
 
       StringEvent e("Morning ");     
 
       QCoreApplication::sendEvent(&m_edit, &e);         //发送事件对象
 
       qDebug() << "event: After sentEvent";
    }
 
   return QWidget::event(evt);                     
}
         //方法二:通过事件过滤器  
bool Widget::eventFilter(QObject* obj,QEvent* evt)    
{
   if( (obj == &m_edit) && (evt->type() ==StringEvent::TYPE) )
    {
       StringEvent* se = dynamic_cast<StringEvent*>(evt);
 
       qDebug() << "Receive: " << se->data();
 
        m_edit.insert(se->data());               
 
       return true;                       
    }
 
   return QWidget::eventFilter(obj, evt);   
}
 
Widget::~Widget()
{
   
}


 声明:
此文根据 狄泰学院唐老师的《QT实验分析教程》创作

QEvent之QMouseEvent:重载mouseDoubleClickEvent实现双击窗口任意位置时放大窗口 QMouseEvent一、介绍二、场景三、实现1.声明2.实现3.使用四、效果 一、介绍 当鼠标按下、松开、双击、或者按下并移动时,都会触发QMouseEvent事件,依次是:QEvent::MouseButtonPress, QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick, or QEvent::MouseMove;倘若在子窗体中对以上事件调用了ignore方法,则事件会被继续传递至父窗体,直至有窗体accept或者被eventfitte 阅读详情

相关推荐

三十五:自定义消息事件

上一课时中讲了 CEP 的基本原理并且用官网的案例介绍了 CEP 的简单应用。在 Flink CEP 中存在多个比较晦涩的概念,如果你对于这些概念理解有困难,我们可以把:创建系列 Pattern,然后利用 NFACompiler 将 Pattern 进行拆分并且创建出 NFA,NFA 包含了 Pattern 中的各个状态和各个状态间转换的表达式。这整个过程我们可以把 Flink CEP 的使用类比为正则表达式的使用。CEP 中定义的 Pattern 就是正则表达式,而 DataStream 是需要进行匹配的

someInNeed的博客 249

Qt 控件(含QPushButton)增加双击事件的实现方法(汇总)鼠标事件穿透(**)

Qt控件(含QPushButton)增加双击事件的实现方法(汇总)

ken2232的博客 6537

第三十六篇:Flink CEP 源码解析和自定义消息事件

你好,欢迎来到第 36 课时,本课时我们主要讲解“Flink CEP 源码解析和自定义消息事件”。 我们在上一课时中讲了 CEP 的基本原理并且用官网的案例介绍了 CEP 的简单应用。在 Flink CEP 中存在多个比较晦涩的概念,如果你对于这些概念理解有困难,我们可以把:创建系列 Pattern,然后利用 NFACompiler 将 Pattern 进行拆分并且创建出 NFA,NFA 包含了 Pattern 中的各个状态和各个状态间转换的表达式。这整个过程我们可以把 Flink CEP 的使用类比为正则

微信搜:import_bigdata,大数据领域硬核原创作者 685

qt关于鼠标、键盘等常用事件

直接上代码吧 .h文件: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QMouseEvent> #include <QWheelEvent> #include <QCloseEvent> #include <QLabel> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE cl.

kchmmd的博客 521

【R】R画图不显示中文问题

系统mac os 11 RstutioVersion1.2.1335 RVersion3.6.2 画图里的中文一直显示成方框。 ggplot()+geom_point(aes(x=ta1$X2011年,y=ta1$X2012))+ xlab("2011年")+ylab("2021年") 解决方案: 使用showtext。 install.packages("showtext", repos = "https://mirrors.ustc.edu.cn/CRAN/") in...

weixin_41772125的博客 1万+

达梦数据库连接报错6001网络通信异常

本文主要记录客户端连接达梦数据库报错6001网络通信异常问题分析过程、问题原因以及问题解决方法。

chen_zizi2025的博客 2772

【转】QMouseEvent鼠标事件简介

首先请注意,Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击、释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理。 以下内容来自QMouseEvent的API文档。 1. QMouseEvent的详细描述 QMouseEvent类包含了用于描述鼠标事件的参数。 当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件QMouseEvent。 鼠标移动事件只会

xuzheng11332的博客 1万+

山景BP10_128DBG开发板ADC_Key驱动

最近在学习山景BP10_128DBG开发板,想使用开发板上的按键。看了看原理图和之前用过的按键好像有点不一样。常见的按键都是判断IO口是否被拉低或拉高来判断按键是否被按下。山景BP10_128DBG开发板上的按键是ADC按键,每个按键按下之后ADC的采样值是不同的,通过ADC采样回来的值进而判断哪个按键按下。这种方式核心思想就是用一个ADC通道来节约IO口,对于IO紧张的芯片是一个不错的解决思路。

weixin_56646002的博客 1311

C#(三十一)之自定义事件

自定义事件

camellia的博客 3380

deepfake detection数据集

最全Deepfake数据集总结,包含各个数据集下载链接: https://github.com/deepfakeinthewild/deepfake_in_the_wild Dataset name Download Generate method Deepfake videos Actors Deepfake-TIMIT low download De...

where_is_horse的博客 1万+

基于单片机直流电机调速控制系统设计

*单片机设计介绍,基于单片机直流电机调速控制系统设计。

2201_75940997的博客 2781

(三十一)Vue之自定义事件

自定义事件一种组件间通信的方式,适用于:子组件 ===> 父组件例如:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。我们把Footer组件与App组件的交互从props改为自定义事件第一步:在App组件里给Footer组件绑定自定义事件第二步:定义回调,这个回调之前已经定义好了,直接调用即可第三步:在Footer组件定义触发第四步:在App组件解绑。

忆亦何为的博客 646

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 604

(三十三)Android开发中自定义接口事件的使用详解

在Android开发中,自定义接口事件是实现组件间通信和解耦的重要机制。它通过定义接口、设置监听器并在适当时候调用接口方法,实现了灵活的通信方式。常见使用场景包括Activity与Fragment的通信、异步操作的回调以及自定义View的事件通知。通过代码示例,展示了如何在Fragment中定义接口并在Activity中实现,以及如何在网络请求和自定义View中应用这一机制。这种方式不仅降低了组件间的耦合度,还提升了代码的可维护性和扩展性,是Android开发中不可或缺的工具。

cuijiying的博客 635

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1346

OpenClaw实战系列01:OpenClaw接入飞书机器人全接入指南 + Ollama本地大模型

通过 OpenClaw + Ollama + 飞书的组合,我们成功搭建了一个完全私有、免费、可定制的AI助理。它不仅能在日常聊天中提供帮助,还能通过OpenClaw强大的“技能”体系,真正去操作你的电脑、管理文件、甚至执行代码。这套方案将数据留在本地,既保证了隐私安全,又锻炼了动手能力。现在,去给你的AI助理添加更多酷炫的技能吧!

PeterPan的博客 1万+

第三十二:6.2. 【自定义事件】

子 => 父。展示数据:子 => 父。注意区分好:原生事件、自定义事件。原生事件:事件名是特定的(clickmosueenter等等)事件对象$event: 是包含事件相关信息的对象(pageXpageYtargetkeyCode自定义事件:事件名是任意名称事件对象$event: 是调用emit时所提供的数据,可以是任意类型!!!示例:--在父组件中,给子组件绑定自定义事件:-->​--注意区分原生事件与自定义事件中的$event-->

小画家 315

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

小程序目前已经支持组件化开发,可以将页面中的功能模块抽取成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。开发中常见的组件有两种:① 公共组件:将页面内的功能模块抽取成自定义组件,以便在不同的页面中重复使用② 页面组件:将复杂的页面拆分成多个低耦合的模块,有助于代码维护如果是公共组件,建议放在项目根目录的 components 文件夹中如果是页面组件,建议放在对应页面的目录下建议:一个组件一个文件夹开发中常见的组件主要分为公共组件和。

时光の尘的博客 2126

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python第三十八天,(线程回调,线程中的队列,事件,greenlet模块,gevent模块,自定义补丁) 单线程实现并发,协程...

1.线程回调 在线程池/进程池每次提交任务,都会返回一个表示任务的对象,Future对象Future对象具备一个绑定方法,add_done_callback 用于指定回调函数  add 意味着可以添加多个回调函数如果直接使用Thread的话,如何完成回调 from threading import Thread import time def call_back(res):...

weixin_30699465的博客 161

ASP.NET程序中常用的三十三种代码(转载)

asp.net程序中最常用的三十三种编程代码,为初学者多多积累经验,为高手们归纳总结,看了觉得很有价值~,大家不妨参考下!1. 打开新的窗口并传送参数:  传送参数: response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="++"’)</script>") 接收参数:...

weixin_34410662的博客 71

三十、鼠标及键盘事件

发生鼠标事件,当在 Widget 内按下 (或释放) 鼠标按钮 (或移动鼠标光标) 时。才发生鼠标移动事件当按下鼠标按钮时,除非启用鼠标跟踪采用().Qt 自动抓取鼠标当在 Widget 内按下鼠标按钮时;Widget 将继续接收鼠标事件,直到最后释放鼠标按钮。鼠标事件包含特殊接受标志 (指示接收者是否想要事件)。应该调用() 若鼠标事件未被 Widget 所处理。鼠标事件会沿父级 Widget 链向上传播,直到小部件接受它采用(),或由事件过滤器消耗掉它。: 若鼠标事件被传播给其中。

qq_67755192的博客 1894

JavaScript 学习之旅:第三十七课 - 事件冒泡和捕获

JavaScript中的事件传播机制主要包括事件冒泡(Event Bubbling)和事件捕获(Event Capturing)两种。

caifox的博客 1438

WPF 基础到企业应用系列索引

WPF 基础到企业应用系列索引   WPF 基础到企业应用系列从WPF的起源、背景、历史、现状讲起,然后逐渐过渡到基础、企业应用以及经验总结等。整个系列计划三十篇左右,每一篇都会认真完成,怀着宁缺毋滥的精神,争取能给读者带来帮助的同时也能提高自己,更进一步希望能以文会友,共同提高!诚然,由于WPF整个系列是自己的一些粗浅心得和微薄经验,所以不会像写书那么面面俱到,如果有不足或者错误之处也请大家见

圣殿骑士 1201

JavaScript 学习之旅:第三十六课 - 事件 Events

JavaScript 事件是浏览器在特定情况下生成的信号,如用户点击鼠标、键盘输入、页面加载完成等。JavaScript 通过事件驱动模型,允许开发者编写代码来响应这些事件,从而实现动态交互的网页应用。

caifox的博客 1415

JavaScript 学习之旅:第三十八课 - 鼠标事件 MouseEvent

鼠标事件是指用户使用鼠标与网页进行交互时发生的事件。

caifox的博客 1294

从0开始学前端 第三十六课:高级事件处理

你可以通过接口创建自定义事件,并使用方法触发这些事件。代码示例// 创建一个自定义事件" }});// 监听自定义事件alert("收到自定义事件,信息为:" + e.detail.message);});// 触发自定义事件。

weixin_44738632的博客 958
上一篇: (二十九)QMimeData类与拖放事件
下一篇: (十补)自定义布局管理器
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值