首先要明白一个概念,事件和信号并不一样,比如单击一下鼠标,就会产生鼠标事件(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):

  

public:
bool eventFilter(QObject *obj, QEvent *event);
protected:
void keyPressEvent(QKeyEvent *event); bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if(obj == lineEidt)
{
if(event->type() == QEvent::KeyPress)
qDebug() << "widget的事件过滤器";
}
return QWidget::eventFilter(obj,event);
} void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug() << "widget键盘按下事件";
}

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

public:
bool event(QEvent *event); protected:
void keyPressEvent(QKeyEvent *event); bool MyLineEdit::event(QEvent *event)
{
if(event->type() == QEvent::KeyPress)
{
qDebug() << "MyLineEdit的event()函数";
event->ignore();
return true;
}
return QLineEdit::event(event); } void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
qDebug() << "MyLineEdit键盘按下事件";
QLineEdit::keyPressEvent(event);
event->ignore();
}

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

3.事件过滤器:

  只是QObject 的两个函数:

  installEventFilter();安装事件过滤器

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

4.事件发送:

  QApplication类的sendEvent()和postEvent();

  区别:

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

5.事件处理函数:

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

  QMouseEvent,QWheelEvent

void mouseDoubleClickEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);

  QKeyEvent,QTimerEvent

void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
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. 第二篇 -- SpringBoot入门Helloworld

    之前讲Jmeter接口的时候讲过社区版怎么创建web接口,那么现在用企业版创建一个Springboot项目.企业版自带Springboot,新建起来更加简单. 第一步:新建一个项目 第二步:选择Spr ...

  2. ubuntu16登录后黑屏无法进入系统问题汇总

    今晚在使用虚拟机的过程中发现有些卡顿,顿时想给虚拟机增加内核数,然后,然后,,,我就再也没有看到过图形化界面,在某搜索引擎查找了半天,把我的问题汇总了一下发出来,希望对遇到同样问题的有所帮助. 出现黑 ...

  3. HSDB工具类使用探索jvm

    本文是引用https://club.perfma.com/article/2261053 有人问了个小问题,说: public class Test { static Test2 t1 = new T ...

  4. create-react-app 创建的项目执行npm run eject后,运行报错

    create-react-app 创建的项目执行npm run eject后,运行报错:Cannot find module '@babel/plugin-transform-react-jsx-so ...

  5. Android内存溢出、内存泄漏常见案例及最佳实践总结

    内存溢出是Android开发中一个老大难的问题,相关的知识点比较繁杂,绝大部分的开发者都零零星星知道一些,但难以全面.本篇文档会尽量从广度和深度两个方面进行整理,帮助大家梳理这方面的知识点(基于Jav ...

  6. Spring Cloud分区发布实践(5)--定制ServiceInstanceListSupplier

    现在我们简单地来定制二个 ServiceInstanceListSupplier, 都是zone-preference的变种. 为了方便, 我重新调整了一下项目的结构, 把一些公用的类移动到hello ...

  7. Android 键盘属性

    键盘定义:通过Keyboard说明是一个软键盘定义文件,Row元素说明这是一行按键的定义,Key元素说明这是一个按键的定义.Key元素通过一些属性来定义每个按键,下面是一些常用的属性介绍: Codes ...

  8. Hybrid接口

    目录 一.Hybrid接口 1.1 VLan的基本概念 1.2 Hybrid接口特点 1.3 Hybrid接口工作原理 1.4 Hybrid配置 一.Hybrid接口 1.1 VLan的基本概念 特点 ...

  9. 【Lua篇】静态代码扫描分析(一)初步介绍

    一.静态代码分析         静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段.通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问 ...

  10. Linux命令(四)之常用文件拷贝/移动,文件解压缩,文件查找等相关的操作

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...