事件过滤器

/*
*事件过滤器不是类,仅仅是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. Building Boost for Android with error “cannot find -lrt”

    编辑tools/build/src/tools/gcc.jam rule setup-threading ( targets * : sources * : properties * ){ local ...

  2. JavaScript arguments对象详解

    1. 什么是 arguments MDN 上解释: arguments 是一个类数组对象.代表传给一个function的参数列表. 我们先用一个例子直观了解下 JavaScript 中的 argume ...

  3. C语言递归练习

    1.炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推.写一个递归函数CannonBall,这个函数把 ...

  4. -bash: locate: command not found

    部分版本的linux系统使用locate快速查找某文件路径会报以下错误: -bash: locate: command not found 其原因是没有安装mlocate这个包 安装:yum  -y ...

  5. Java Agent初探——动态修改代码

    用了一下午总算把java agent给跑通了,本篇文章记录一下具体的操作步骤,以免遗忘... 通过java agent可以动态修改代码(替换.修改类的定义),进行AOP. 目标: ? 1 为所有添加@ ...

  6. MVC + ajaxform 文件上传

    一.前端cshtml代码 <tr> <td width="130" align="right">添加附件:</td> @us ...

  7. iOS - ipa安装包大小优化

    在App Store上显示的下载大小和实际下载下来的大小,我们通过下表做一个对比: iPhone型号 系统 AppStore 显示大小 下载到设备大小 iPhone6 10.2.1 91.5MB 88 ...

  8. CentOS6.5 下将 Python2.6.6 升级到Python3.5

    一. 从Python官网到获取Python3的包, 切换到目录/usr/local/src #wget https://www.python.org/ftp/python/3.5.1/Python-3 ...

  9. Linux磁盘处理

    查看磁盘占用率 df -l 既然确定了哪块磁盘占用率高,那就切换到这块磁盘检查一下这块磁盘的哪个文件夹占用高,再逐层去查找 du -h --max-depth=1

  10. informix数据库知识积累

    一.嵌套查询 informix子查询:嵌套查询(1)select first 20 * from (select first 40 * from hlrquery_log order by id de ...