首先要明白一个概念,事件和信号并不一样,比如单击一下鼠标,就会产生鼠标事件(QMouseEvent),是对这个动作的描述,而因为按钮被按下了,按钮会发出clicked()的单击信号(是按钮控件产生的)。

1.事件处理方式:

  method 1:重新实现部件的事件处理函数,如:mousePressEvent(),keyPressEvent()等等。是最常用的方法!!!

  method 2:重新实现notify()函数。需要继承QApplication类,可以再事件过滤事件之前获得事件,一次只可以处理一个事件。

  method 3:向QApplication的全局对象安装时间过滤器,一个程序只有一个QApplication对象,可以处理多个事件,与method 2功能相同。

  method 4:重新实现event()函数。QObject的event()函数可以再默认事件处理函数之前获得该事件。

  method 5:在对象上安装事件过滤器。

2.事件传递过程:

  父部件的事件过滤器  ->  本部件的event()函数  ->  本部件的事件处理函数  ->  父部件的处理函数(前提是子部件忽略该事件)

父部件的代码示例(分别为.h和.cpp):

  

  1. public:
  2. bool eventFilter(QObject *obj, QEvent *event);
  3. protected:
  4. void keyPressEvent(QKeyEvent *event);
  5.  
  6. bool Widget::eventFilter(QObject *obj, QEvent *event)
  7. {
  8. if(obj == lineEidt)
  9. {
  10. if(event->type() == QEvent::KeyPress)
  11. qDebug() << "widget的事件过滤器";
  12. }
  13. return QWidget::eventFilter(obj,event);
  14. }
  15.  
  16. void Widget::keyPressEvent(QKeyEvent *event)
  17. {
  18. qDebug() << "widget键盘按下事件";
  19. }

子部件的代码实例:(QLineEdit控件)

  1. public:
  2. bool event(QEvent *event);
  3.  
  4. protected:
  5. void keyPressEvent(QKeyEvent *event);
  6.  
  7. bool MyLineEdit::event(QEvent *event)
  8. {
  9. if(event->type() == QEvent::KeyPress)
  10. {
  11. qDebug() << "MyLineEdit的event()函数";
  12. event->ignore();
  13. return true;
  14. }
  15. return QLineEdit::event(event);
  16.  
  17. }
  18.  
  19. void MyLineEdit::keyPressEvent(QKeyEvent *event)
  20. {
  21. qDebug() << "MyLineEdit键盘按下事件";
  22. QLineEdit::keyPressEvent(event);
  23. event->ignore();
  24. }

运行结果如下:(如果在子部件没有忽略事件,那么父部件的事件处理函数不会被调用)

3.事件过滤器:

  只是QObject 的两个函数:

  installEventFilter();安装事件过滤器

  eventFilter(QObject *obj, QEvent *event);实现事件处理

4.事件发送:

  QApplication类的sendEvent()和postEvent();

  区别:

postEvent sendEvent
放到等待调度队列 立即处理
必须在堆上(new)创建QEvent对象,会自动删除 无法自动删除,需要在栈上创建QEvent对象(系统释放)

5.事件处理函数:

  函数非常多,但这里只总结经常使用到的。

  QMouseEvent,QWheelEvent

  1. void mouseDoubleClickEvent(QMouseEvent *event);
  2. void mouseMoveEvent(QMouseEvent *event);
  3. void mousePressEvent(QMouseEvent *event);
  4. void mouseReleaseEvent(QMouseEvent *event);
  5. void wheelEvent(QWheelEvent *event);

  QKeyEvent,QTimerEvent

  1. void keyPressEvent(QKeyEvent *event);
  2. void keyReleaseEvent(QKeyEvent *event);
  3. void timerEvent(QTimerEvent *event);

Qt5之事件学习总结的更多相关文章

  1. Mysql事件学习

    出自:http://blog.chinaunix.net/uid-20639775-id-3323098.html Mysql事件学习 在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQ ...

  2. C#委托与事件学习笔记

    委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...

  3. C# event 事件学习

    C# event 事件学习 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-26 章节: 简单事件编写 模拟 WPF 控件传递 ...

  4. 《JS高程》事件学习笔记

    事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...

  5. JS 点击事件学习总结

    废话篇: 在我们编写无论什么网页内容的时候我们总是或多或少的要接触到点击事件这一范畴的,写过几个简短的demo和网页之后,感觉自己对电机事件一类的东西了解也更为的清楚了,之前写过很多零零散散的东西现在 ...

  6. android touchEvent事件学习

    学习网址:http://www.apkbus.com/forum.php?mod=viewthread&tid=44296 1:Android Touch事件传递机制解析 android系统中 ...

  7. jQuery事件学习

    1.JS事件的基本知识 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  8. Qt5鼠标事件及实例

    mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLa ...

  9. jQuery Mobile的学习时间bottonbutton的事件学习

    程序猿都非常懒.你懂的! 生命的绝唱来机仅仅争朝夕,如诗的年华更需惜时如金. 不要让今天的懈怠成为一生的痛. 每天都在进步. 近期在学习jquery mobile开发.使用的button,绑定事件,和 ...

随机推荐

  1. BOM(Bill of Material)物料清单基础知识(一)

                                                                                            一.BOM的基础概念 概 ...

  2. 添加底部导航栏tabbar

    效果图: 如果要添加底部导航栏,最少2个,最多5个. app.json { "pages": [ "pages/index/index", "page ...

  3. videojs文档翻译-Player(v6.0.0-RC.2)

    Player 当使用任何Video.js设置方法初始化视频时,将创建Player类的实例. 创建实例后,可以通过两种方式在全局访问: 调用videojs('example_video_1');直接通过 ...

  4. springboot整合ehcache缓存失效

    最近做了个微信公众号后台,因为只是单应用就选用了ehcache来做本地缓存,主要是用于缓存微信的accece_token和jsapi_ticket.在使用ehcache的时候遇到了@Cacheable ...

  5. Optional解决空指针

    Java 8 Optional 类 Java 8 新特性 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. O ...

  6. SpringCloud升级之路2020.0.x版-8.理解 NamedContextFactory

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ spring- ...

  7. Lateral Movement

    简介 这次去宁夏护网,发现我有的朋友连最基本的横向渗透有些都不晓得,他们问我 我也表达不清楚...,就想着写篇文章总结下吧 (慢慢更..) 可以发我邮箱讨论:muxue@protonmail.com ...

  8. linux虚拟机环境快速搭建redis5.x版本的主从集群总结

    文/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建,但时间久了,都快忘记当时的搭建过程了,故而决定在虚拟机centOS 7的环境,自行搭建一套redis5.x版本的集群,该版本集群的搭建比 ...

  9. 题解 P3451 [POI2007]ATR-Tourist Attractions

    题解 这里的做法是卡空间的做法,相比于滚动数组,这种做法因为没有三维数组寻址的大常数,所以较快. 在普通的做法中,\(dp[state][i]\) 表示以 \(i\) 结尾,那么 \(state\) ...

  10. windows和liunx下换行符问题

    区别 windows换行符是: \r\n liunx换行符是: \n 问题 程序处理的时候就会有问题,因为在Windows的文件多了一个\r 解决办法(转换文件格式) vim file :set fi ...