首先要明白一个概念,事件和信号并不一样,比如单击一下鼠标,就会产生鼠标事件(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. JS通用校验工具

    将以下form的校验内容存放到路径中 1 // 是否包含<script> 2 export function checkScript(rule, value, callback) { 3 ...

  2. c++ 的父类 new 重载, 子类new 对象的时候会调用父类的operater new

    子类在new 对象的 时候  父类的new 进行了重载,那么会调用父类的operater new() 函数 #include <iostream> #include <string& ...

  3. synchronized 加锁 this 和 class 的区别!

    synchronized 是 Java 语言中处理并发问题的一种常用手段,它也被我们亲切的称之为"Java 内置锁",由此可见其地位之高.然而 synchronized 却有着多种 ...

  4. Wordpress 4.6 任意命令执行漏洞(PwnScriptum)

    漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...

  5. solr(CVE-2019-17558)远程命令执行

    影响版本 Apache Solr 5.x到8.2.0版本 测试 https://github.com/jas502n/CVE-2019-0193

  6. Linux的链接(入门)

    Linux的链接分为两种:硬链接和软链接 硬链接:如果B是A的硬链接,那么B和A指向同一个文件,但是删除A并不会影响B->允许一个文件有多个路径 软链接:类似Windows下的快捷方式,删除原文 ...

  7. 科普—为什么要用ECDSA加签及其数学上的验签证明

    在上文介绍了ECDSA算法流程及模块划分,为了帮助一些小白弄懂啥是ECDSA,特此开一篇科普博文. 一.首先为啥要进行数字签名? 假设Alice要将一份合同m传输给Bob,合同上附有Alice的电子纸 ...

  8. appium自动化测试(4)部分方法&unitest初步使用

    捕捉弹窗 https://github.com/appium/appium/issues/968完整有截屏的例子:https://github.com/bitbar/testdroid-samples ...

  9. Java_classpath

    Java_classpath 什么是classpath? classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class. 因为Java是编译型语言,源码文件是.java,而编译后的 ...

  10. Docker源码安装附内网镜像安装演示

    Docker源码安装附内网镜像安装演示 系统版本要求 当前系统版本:CentOS Linux release 7.9.2009 (Core) 内核版本:3.10.0-1160.el7.x86_64 注 ...