事件过滤器

  1. /*
  2. *事件过滤器不是类,仅仅是QObject类的两个函数:installEventFilter() 和 eventFilter() 。
  3. *下面讲个例子:
  4. * 监视过滤 textEdit的鼠标滚轮事件;监视过滤 spinBox的 空格按键事件。
  5. *2018.4.2 张洪铭
  6. */
  7.  
  8. //widget.h
  9. public:
  10. bool eventFilter(QObject *watched, QEvent *event);
  1. //widget.cpp
  2. #include <QWheelEvent>
  3. #include <QKeyEvent>
  4.  
  5. //...
  6. //构造函数
  7. ui->textEdit->installEventFilter(this); //this参数表明由本widget部件来负责对 textEdit 的监视和事件过滤
  8. ui->spinBox->installEventFilter(this);
  9. //...
  10.  
  11. bool Widget::eventFilter(QObject *watched, QEvent *event)
  12. {
  13. if( watched == ui->textEdit ){ //第一步:判断是否是被事件过滤器过滤的对象
  14. if( event->type() == QEvent::Wheel ){ //第二部:判断是否是需要过滤的事件
  15. QWheelEvent * wheelEvent = static_cast<QWheelEvent*>(event);//第三步:将event强制转换为发生的事件类型
  16. if(wheelEvent->delta()>)
  17. ui->textEdit->zoomIn();
  18. else
  19. ui->textEdit->zoomOut();
  20. return true; //!!!如果需要该事件继续被传递和被处理,返回true。这很重要!!!。
  21. }
  22. else
  23. return false;//!!!如果不希望该事件继续被传递和被处理,返回false。这很重要!!!。
  24. }
  25.  
  26. else if( watched == ui->spinBox ){
  27. if(event->type() == QEvent::KeyPress){
  28. QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
  29. if(keyEvent->key() == Qt::Key_Space ){//如果是空格键
  30. ui->spinBox->setValue();
  31. return true;
  32. }
  33. }
  34. else
  35. return false;
  36. }
  37. else
  38. return QWidget::eventFilter(watched,event); //最后:返回默认执行结果!!!。
  39.  
  40. }

[对比前后]

事件发送:

  1. /*
  2. *Qt 还提供了 事件发送 的功能,是QCoreApplication类提供的。
  3. * bool QCoreApplication::sendEvent(QObject * receiverObj,QEvent * event);
  4. * bool QCoreApplication::postEvent(QObject * receiverObj,QEvent * event,int priority = Qt::NorMalEventPriority);
  5. *区别:
  6. * sendEvent()立即处理事件;postEvent()把事件放到等待调度队列中。
  7. * sendEvent()中的QEvent参数对象在事件发送后,自动删除,所以需要在栈上创建QEvent;
  8. * postEvent()中的QEvent参数对象必须new创建,事件发送后,由队列自动删除。
  9. *
  10. * 下面提供一个例子:构造函数添加代码,实现想spinBox发送一个向上按钮触发事件。
  11. */
  12. QKeyEvent myEvent(QEvent::KeyPress,Qt::Key_Up,Qt::NoModifier);//第三个参数:没有任何修饰键按下
  13. 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. ansible register基础使用讲解

    当我们需要判断对执行了某个操作或者某个命令后,如何做相应的响应处理(执行其他 ansible 语句),则一般会用到register . 举个例子: 我们需要判断 zip 包是否存在,如果存在了就执行一 ...

  2. 单引号、双引号、int和char

    首先说一下C语言中用单引号和双引号的不同(一直搞不清楚): 单引号代表的是一个整数,而这个整数的值是编译器所采用的字符集中的字符序列对应的值.所以一般'A'和ASCII中的65意义相同.对于双引号定义 ...

  3. Mongodb之使用rpm包安装配置启动

    下载rpm包 wget https://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.2/x86_64/RPMS/mongod ...

  4. hdu6393Traffic Network in Numazu【树状数组】【LCA】

    Traffic Network in Numazu Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (J ...

  5. ubuntu16.04下安装文献管理工具mendelay

    1.首先下载mendelay的安装包 到官网下载对应版本的安装包,官网地址:Download for Ubuntu and Kubuntu 16.04 LTS, 17.04 and Debian 2. ...

  6. Scala学习笔记(2)-类型注意

    Scala类型注意事项: 1.Any是绝对的根,所有的其他可实例化类型均有AnyVal和AnyRef派生. 2.所有AnyVal的类型成为值类型(所有数值类型.char.Booble和Unit) 3. ...

  7. HDU 3091 - Necklace - [状压DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3091 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  8. TensorFlow softmax的互熵损失

    函数:tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None) 功能:这个函数的作用是计算 logits 经 softmax ...

  9. 如何快速创建提交一个项目到Github

    1.https://github.com创建一个repository 2.本地创建一个文件夹A 3.命令行转到新文件夹A,执行git init使其能被git管理,并生成.git隐藏文件 4.如内容,应 ...

  10. 学习计划 nginx 中 php的配置详解

    本章只看一个刚下载的nginx是如何支持php的 -- location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_inde ...