事件过滤器

/*
*事件过滤器不是类,仅仅是QObject类的两个函数:installEventFilter() 和 eventFilter() 。
*下面讲个例子:
* 监视过滤 textEdit的鼠标滚轮事件;监视过滤 spinBox的 空格按键事件。
*2018.4.2 张洪铭
*/ //widget.h
public:
bool eventFilter(QObject *watched, QEvent *event);
//widget.cpp
#include <QWheelEvent>
#include <QKeyEvent> //...
//构造函数
ui->textEdit->installEventFilter(this); //this参数表明由本widget部件来负责对 textEdit 的监视和事件过滤
ui->spinBox->installEventFilter(this);
//... bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if( watched == ui->textEdit ){ //第一步:判断是否是被事件过滤器过滤的对象
if( event->type() == QEvent::Wheel ){ //第二部:判断是否是需要过滤的事件
QWheelEvent * wheelEvent = static_cast<QWheelEvent*>(event);//第三步:将event强制转换为发生的事件类型
if(wheelEvent->delta()>)
ui->textEdit->zoomIn();
else
ui->textEdit->zoomOut();
return true; //!!!如果需要该事件继续被传递和被处理,返回true。这很重要!!!。
}
else
return false;//!!!如果不希望该事件继续被传递和被处理,返回false。这很重要!!!。
} else if( watched == ui->spinBox ){
if(event->type() == QEvent::KeyPress){
QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
if(keyEvent->key() == Qt::Key_Space ){//如果是空格键
ui->spinBox->setValue();
return true;
}
}
else
return false;
}
else
return QWidget::eventFilter(watched,event); //最后:返回默认执行结果!!!。 }

[对比前后]

事件发送:

/*
*Qt 还提供了 事件发送 的功能,是QCoreApplication类提供的。
* bool QCoreApplication::sendEvent(QObject * receiverObj,QEvent * event);
* bool QCoreApplication::postEvent(QObject * receiverObj,QEvent * event,int priority = Qt::NorMalEventPriority);
*区别:
* sendEvent()立即处理事件;postEvent()把事件放到等待调度队列中。
* sendEvent()中的QEvent参数对象在事件发送后,自动删除,所以需要在栈上创建QEvent;
* postEvent()中的QEvent参数对象必须new创建,事件发送后,由队列自动删除。
*
* 下面提供一个例子:构造函数添加代码,实现想spinBox发送一个向上按钮触发事件。
*/
QKeyEvent myEvent(QEvent::KeyPress,Qt::Key_Up,Qt::NoModifier);//第三个参数:没有任何修饰键按下
QApplication::sendEvent(ui->spinBox,&myEvent); //

[前后对比]

Qt事件过滤器和事件的发送的更多相关文章

  1. Qt事件系统之五:事件过滤器和事件的发送

    Qt提供了事件过滤器来实现在一个部件中监控其他多个部件的事件.事件过滤器与其他部件不同,它不是一个类,只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件的监视.这两个函数分别是 insta ...

  2. QT学习 之 事件与事件过滤器(分为五个层次)

    事件 在Qt中,事件是作为对象处理的,所有事件对象继承自抽象类QEvent.此类用来表示程序内部发生或者来自于外部但应用程序应该知道的动作.事件能够能过被 QObject 的子类接受或者处理,但是通常 ...

  3. QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)

    Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoD ...

  4. qt中的事件机制

    事件 1.QEvent -->类型 -> QKeyEvent QEvent::KeyRelease QEvent::MouseMove -> QMouseEvent 2.事件处理过程 ...

  5. Qt ------ 再论事件循环

    在介绍在以前,我们要认识两个术语: 可重入的(Reentrant):如果多个线程可以在同一时刻调用一个类的所有函数,并且保证每一次函数调用都引用一个唯一的数据,就称这个类是可重入的(Reentrant ...

  6. Qt自己定义事件实现及子线程向主线程传送事件消息

    近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...

  7. Qt之键盘事件监听-实时响应大小写Capslock按键

    目录 一.开篇 二.效果展示 三.实现思路 1.重写QLlinEdit 2.全局应用程序事件 3.windows钩子 四.相关文章 原文链接:Qt之键盘事件监听-实时响应大小写Capslock按键 一 ...

  8. 【Qt开发】事件循环与线程 一

    事件循环与线程 一 初次读到这篇文章,译者感觉如沐春风,深刻体会到原文作者是花了很大功夫来写这篇文章的,文章深入浅出,相信仔细读完原文或下面译文的读者一定会有收获. 由于原文很长,原文作者的行文思路是 ...

  9. QT槽函数获取信号发送对象

    Qt 在槽函数中获取信号发送对象 Qt中提供了一个函数 qobject_cast(QObject *object),可以通过这个函数判断信号发出对象 Qt 帮助文档的解释: Returns the g ...

随机推荐

  1. Sencha Touch 实战开发培训 视频教程 第二期 第八节 (完结)

    2014.4.23 晚上8:00左右开课. 本节课耗时超长,因为演示过程中出现了一些小错误,所以耗时接近2小时. 本期培训一共八节,前两节免费,后面的课程需要付费才可以观看. 本节内容: 开发cord ...

  2. 部署OpenStack问题汇总(三)--Failed to add image

    使用glance add 上传完img文件的时候出现了下面的错误 ------------------------------------------------------------------- ...

  3. Protobuf的安装使用

    date: 2018-10-12  18:59:13 版权归属原作者,本位转自:https://www.cnblogs.com/autyinjing/p/6495103.html 1. 是什么? Go ...

  4. TX失败策略2

    自从有了人类,就有了智慧和精神.但总有一些思想家跳出来说人定胜天的理论,这是一种严重的误导.人类社会和自然界一样,遵守统一的自然定律.人就像不能改变物理定律一样改社会定律.更不可能因片面的社会现象遮盖 ...

  5. Spring Cloud Eureka 服务治理机制

     服务提供者         服务提供者在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息.Eureka Server 接收到这个RE ...

  6. iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案

    在ARC(自动引用技术)前,Objective-c都是手动来分配释放 释放 计数内存,其过程非常复杂. ARC技术推出后,貌似世界和平了很多,但是其实ARC并不等同于Java或者C#中的垃圾回收,AR ...

  7. nginx动静分离小示例

    server { listen ; server_name www.xxx.cn; #静态页面 #匹配首页,url:www.xxx.cn index index.html; root /usr/loc ...

  8. VMware 安装CentOS 6.5图文步骤 以及安装后无法联网的解决办法

    一.VMwareWorkstation10 中安装Centos6.5(64位)步骤: 首先下载vmware 和centos6.5 1. 打开VMware-workstation点击“新建虚拟机”,到向 ...

  9. 通过JS模拟select表单,达到美化效果[demo][转]

    转自: http://www.cnblogs.com/dreamback/p/SelectorJS.html 通过JS模拟select表单,达到美化效果 Demo ------------------ ...

  10. Bagging和Boosting的概念与区别

    随机森林属于集成学习(ensemble learning)中的bagging算法,在集成算法中主要分为bagging算法与boosting算法, Bagging算法(套袋发) bagging的算法过程 ...