事件
1.QEvent -->类型 -> QKeyEvent
QEvent::KeyRelease
QEvent::MouseMove -> QMouseEvent
2.事件处理过程
三大类型事件:
1.Spontaneous events(系统产生) -->事件队列
2.Posted events (QT) ---> 事件队列
3.Sent events

先处理QT事件队列的事件,然后再处理系统消事件队列。在处理系统的事件队例,产生新的QT事件,

a.exec()//事件循环 -->发给目标
{
while( !postedEvents ) { processPostedEvents(); }
while( !qwsEvnts ){ qwsProcessEvents();?? }
while( !postedEvents ) { processPostedEvents(); }

}

读事件后 通bool QApplication::notify ( QObject * receiver, QEvent * event )

目标:带有一个处理函数
bool QWidget::event(QEvent * event)
{

switch (event->type())
{

case QEvent::KeyPress:{
keyPressEvent((QKeyEvent *)event);
if (!((QKeyEvent *)event)->isAccepted())
return false;
break;}

case QEvent::KeyRelease:{
keyReleaseEvent((QKeyEvent *)event);
if (!((QKeyEvent *)event)->isAccepted())
return false;
break;}
...
case
leaveEvent();
case:
}
return QWidget::event(QEvent * event);

}
void QWidget::keyPressEvent(QKeyEvent * event)
{

event->key()==Qt::Key_Delete

}
void QWidget::keyReleaseEvent(QKeyEvent * event)
{

}

3.过滤器(****重点*****)
1.目标注册一个过滤器installEventFilter()

2。修改过滤器的eventFilter()

改变一个事件的效果
1,重新实现事件函数。 比如: mousePressEvent(), keyPress-Event(), paintEvent() 。 这是最常规的事件处理方法。

2,重新实现QObject::event().
这一般用在Qt没有提供该事件的处理函数时。也就是,我们增加新的事件时。

3,安装事件过滤器

4,在 QApplication 上安装事件过滤器。
QApplication 上的事件过滤器将捕获应用程序的所有事件,而且第一个获得该事件。也就是说事件在发送给其它任何一个event filter之前发送给QApplication的event filter。

5,重新实现QApplication 的 notify()方法.
Qt使用 notify()来分发事件。要想在任何事件处理器捕获事件之前捕获事件,唯一的方法就是重新实现QApplication 的 notify()方法。

------------------------------------------------------------------------------------------

过滤器范例:

event.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include<QEvent>
  4. #include <QMainWindow>
  5.  
  6. namespace Ui {
  7. class MainWindow;
  8. }
  9.  
  10. class MainWindow : public QMainWindow
  11. {
  12. Q_OBJECT
  13.  
  14. public:
  15. explicit MainWindow(QWidget *parent = );
  16. ~MainWindow();
  17. bool eventFilter(QObject *obj, QEvent *evt);
  18. private:
  19. Ui::MainWindow *ui;
  20. };
  21.  
  22. #endif // MAINWINDOW_H
  1. event.cpp
  2. #include "mainwindow.h"
  3. #include "ui_mainwindow.h"
  4.  
  5. MainWindow::MainWindow(QWidget *parent) :
  6. QMainWindow(parent),
  7. ui(new Ui::MainWindow)
  8. {
  9. ui->setupUi(this);
  10. ui->pushButton->installEventFilter(this);
  11. }
  12.  
  13. MainWindow::~MainWindow()
  14. {
  15. delete ui;
  16. }
  17. bool MainWindow::eventFilter(QObject *obj, QEvent *evt)
  18. {
  19. if(obj==ui->pushButton)
  20. {
  21. if (evt->type() == QEvent::Enter)
  22. ui->label->setText("welcome");
  23. if(evt->type()==QEvent::Leave)
  24. ui->label->setText("byebye");
  25.  
  26. }
  27. return 0;
  28. }
  1. ui.h
  2. /********************************************************************************
  3. ** Form generated from reading UI file 'mainwindow.ui'
  4. **
  5. ** Created by: Qt User Interface Compiler version 5.5.0
  6. **
  7. ** WARNING! All changes made in this file will be lost when recompiling UI file!
  8. ********************************************************************************/
  9.  
  10. #ifndef UI_MAINWINDOW_H
  11. #define UI_MAINWINDOW_H
  12.  
  13. #include <QtCore/QVariant>
  14. #include <QtWidgets/QAction>
  15. #include <QtWidgets/QApplication>
  16. #include <QtWidgets/QButtonGroup>
  17. #include <QtWidgets/QHeaderView>
  18. #include <QtWidgets/QLabel>
  19. #include <QtWidgets/QMainWindow>
  20. #include <QtWidgets/QMenuBar>
  21. #include <QtWidgets/QPushButton>
  22. #include <QtWidgets/QStatusBar>
  23. #include <QtWidgets/QToolBar>
  24. #include <QtWidgets/QWidget>
  25.  
  26. QT_BEGIN_NAMESPACE
  27.  
  28. class Ui_MainWindow
  29. {
  30. public:
  31. QWidget *centralWidget;
  32. QPushButton *pushButton;
  33. QLabel *label;
  34. QMenuBar *menuBar;
  35. QToolBar *mainToolBar;
  36. QStatusBar *statusBar;
  37.  
  38. void setupUi(QMainWindow *MainWindow)
  39. {
  40. if (MainWindow->objectName().isEmpty())
  41. MainWindow->setObjectName(QStringLiteral("MainWindow"));
  42. MainWindow->resize(, );
  43. centralWidget = new QWidget(MainWindow);
  44. centralWidget->setObjectName(QStringLiteral("centralWidget"));
  45. pushButton = new QPushButton(centralWidget);
  46. pushButton->setObjectName(QStringLiteral("pushButton"));
  47. pushButton->setGeometry(QRect(, , , ));
  48. label = new QLabel(centralWidget);
  49. label->setObjectName(QStringLiteral("label"));
  50. label->setGeometry(QRect(, , , ));
  51. MainWindow->setCentralWidget(centralWidget);
  52. menuBar = new QMenuBar(MainWindow);
  53. menuBar->setObjectName(QStringLiteral("menuBar"));
  54. menuBar->setGeometry(QRect(, , , ));
  55. MainWindow->setMenuBar(menuBar);
  56. mainToolBar = new QToolBar(MainWindow);
  57. mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
  58. MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
  59. statusBar = new QStatusBar(MainWindow);
  60. statusBar->setObjectName(QStringLiteral("statusBar"));
  61. MainWindow->setStatusBar(statusBar);
  62.  
  63. retranslateUi(MainWindow);
  64.  
  65. QMetaObject::connectSlotsByName(MainWindow);
  66. } // setupUi
  67.  
  68. void retranslateUi(QMainWindow *MainWindow)
  69. {
  70. MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", ));
  71. pushButton->setText(QApplication::translate("MainWindow", "PushButton", ));
  72. label->setText(QApplication::translate("MainWindow", "TextLabel", ));
  73. } // retranslateUi
  74.  
  75. };
  76.  
  77. namespace Ui {
  78. class MainWindow: public Ui_MainWindow {};
  79. } // namespace Ui
  80.  
  81. QT_END_NAMESPACE
  82.  
  83. #endif // UI_MAINWINDOW_H

qt中的事件机制的更多相关文章

  1. Qt中的事件

    1. 引自---http://blog.sina.com.cn/s/blog_6e80f1390100pro4.html 信号和事件的区别就在与,事件比信号更加底层,而且如果一个信号对应多个槽的话,信 ...

  2. jQuery中的事件机制深入浅出

    昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...

  3. Tomcat与Spring中的事件机制详解

    最近在看tomcat源码,源码中出现了大量事件消息,可以说整个tomcat的启动流程都可以通过事件派发机制串起来,研究透了tomcat的各种事件消息,基本上对tomcat的启动流程也就有了一个整体的认 ...

  4. Spring 中的事件机制

    说到事件机制,可能脑海中最先浮现的就是日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作.这些listener是怎 ...

  5. nodeJS中的事件机制

    events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Node.js ...

  6. javascript 中的事件机制

    1.javascript中的事件. 事件流 javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑 ...

  7. libevent中的事件机制

    libevent是事件驱动的网络库,事件驱动是他的核心,所以理解事件驱动对于理解整个网络库有很重要的意义.       本着从简入繁,今天分析下单线程最简单的事件触发.通过sample下的event- ...

  8. Flex中利用事件机制进行主程序与子窗体间参数传递

    在开发具有子窗体,或者itemrenderer的应用时,常常涉及到子窗体向父窗体传递参数或者从itemrenderer内的控件向外部的主程序传递参数的需求.这些都可以通过事件机制这一统一方法加以解决. ...

  9. C#中的事件机制

    这几天把事件学了一下,总算明白了一些.不多说了,直接代码. class Program { static void Main(string[] args) { CatAndMouse h = new ...

随机推荐

  1. Angular(2+) 国际化方案(ngx-translate)

    本文只针对ngx-translate/core 6.x版本,如果你使用的是5.x或者更低的版本,请参照以下链接. https://github.com/ngx-translate/core/blob/ ...

  2. NopCommerce用core重写ef

    最近看了NopCommerce源码,用core学习着写了一个项目,修改的地方记录下.项目地址 NopCommerce框架出来好久了.18年的第一季度 懒加载出来后也会全部移动到.net core.那么 ...

  3. 函数iconv_substr和mb_substr

    二个函数iconv_substr和mb_substr,均可以在当前字符下进行字符串截取,以达到中文字符截取的不乱码. 应该如何选择呢? 1.iconv库在某些操作系统上可能运行不正确,需要安装GNU扩 ...

  4. 今天遇到了一个Spring出现的一个未知错误,分享下

    异常内容: 未知错误[COM999] 使用环境:dubbo+SpringMVC+myBatis 解决方案:检查Spring配置文件,发现配置文件在注入Service的时候写错了 com.wu.wsf. ...

  5. linux 硬软链接区别

    linux 硬软链接区别 linux的软连接(symbolic link or soft link)类似于windows的快捷方式:而硬链接(hard link)机制有点像copy,不过不同的是,带有 ...

  6. Linux网络设备驱动架构

    Linux网络设备驱动程序体系结构分为四层:网络协议接口层.网络设备接口层.提供实际功能的设备驱动层以及网络设备与媒介层. (1)网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议是AR ...

  7. scrapy_全站爬取

    如何查询scrapy有哪些模版? scrapy genspider –list 如何创建crawl模版? scrapy genspider -t crawl 域名 scrapy genspider - ...

  8. 微信小程序实战:天气预报

    接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...

  9. Can’t open /dev/* exclusively. Mounted filesystem?解决

    1 错误提示:Can’t open /dev/* exclusively. Mounted filesystem? 做完软件RAID之后,根据鸟哥书上的操作,其实没有真正删除软件RAID,导致出现如下 ...

  10. JAVA中发送电子邮件的方法

    JAVA中发送邮件的方法不复杂,使用sun的JavaMail的架包就可以实现.  一.下载JavaMail的架包,并导入项目中,如下: 二.附上代码例子,如下: 1.在main函数中对各项参数进行赋值 ...