qt中的事件机制
事件
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
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include<QEvent>
- #include <QMainWindow>
- namespace Ui {
- class MainWindow;
- }
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = );
- ~MainWindow();
- bool eventFilter(QObject *obj, QEvent *evt);
- private:
- Ui::MainWindow *ui;
- };
- #endif // MAINWINDOW_H
- event.cpp
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- ui->pushButton->installEventFilter(this);
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- bool MainWindow::eventFilter(QObject *obj, QEvent *evt)
- {
- if(obj==ui->pushButton)
- {
- if (evt->type() == QEvent::Enter)
- ui->label->setText("welcome");
- if(evt->type()==QEvent::Leave)
- ui->label->setText("byebye");
- }
- return 0;
- }
- ui.h
- /********************************************************************************
- ** Form generated from reading UI file 'mainwindow.ui'
- **
- ** Created by: Qt User Interface Compiler version 5.5.0
- **
- ** WARNING! All changes made in this file will be lost when recompiling UI file!
- ********************************************************************************/
- #ifndef UI_MAINWINDOW_H
- #define UI_MAINWINDOW_H
- #include <QtCore/QVariant>
- #include <QtWidgets/QAction>
- #include <QtWidgets/QApplication>
- #include <QtWidgets/QButtonGroup>
- #include <QtWidgets/QHeaderView>
- #include <QtWidgets/QLabel>
- #include <QtWidgets/QMainWindow>
- #include <QtWidgets/QMenuBar>
- #include <QtWidgets/QPushButton>
- #include <QtWidgets/QStatusBar>
- #include <QtWidgets/QToolBar>
- #include <QtWidgets/QWidget>
- QT_BEGIN_NAMESPACE
- class Ui_MainWindow
- {
- public:
- QWidget *centralWidget;
- QPushButton *pushButton;
- QLabel *label;
- QMenuBar *menuBar;
- QToolBar *mainToolBar;
- QStatusBar *statusBar;
- void setupUi(QMainWindow *MainWindow)
- {
- if (MainWindow->objectName().isEmpty())
- MainWindow->setObjectName(QStringLiteral("MainWindow"));
- MainWindow->resize(, );
- centralWidget = new QWidget(MainWindow);
- centralWidget->setObjectName(QStringLiteral("centralWidget"));
- pushButton = new QPushButton(centralWidget);
- pushButton->setObjectName(QStringLiteral("pushButton"));
- pushButton->setGeometry(QRect(, , , ));
- label = new QLabel(centralWidget);
- label->setObjectName(QStringLiteral("label"));
- label->setGeometry(QRect(, , , ));
- MainWindow->setCentralWidget(centralWidget);
- menuBar = new QMenuBar(MainWindow);
- menuBar->setObjectName(QStringLiteral("menuBar"));
- menuBar->setGeometry(QRect(, , , ));
- MainWindow->setMenuBar(menuBar);
- mainToolBar = new QToolBar(MainWindow);
- mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
- MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
- statusBar = new QStatusBar(MainWindow);
- statusBar->setObjectName(QStringLiteral("statusBar"));
- MainWindow->setStatusBar(statusBar);
- retranslateUi(MainWindow);
- QMetaObject::connectSlotsByName(MainWindow);
- } // setupUi
- void retranslateUi(QMainWindow *MainWindow)
- {
- MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", ));
- pushButton->setText(QApplication::translate("MainWindow", "PushButton", ));
- label->setText(QApplication::translate("MainWindow", "TextLabel", ));
- } // retranslateUi
- };
- namespace Ui {
- class MainWindow: public Ui_MainWindow {};
- } // namespace Ui
- QT_END_NAMESPACE
- #endif // UI_MAINWINDOW_H
qt中的事件机制的更多相关文章
- Qt中的事件
1. 引自---http://blog.sina.com.cn/s/blog_6e80f1390100pro4.html 信号和事件的区别就在与,事件比信号更加底层,而且如果一个信号对应多个槽的话,信 ...
- jQuery中的事件机制深入浅出
昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScr ...
- Tomcat与Spring中的事件机制详解
最近在看tomcat源码,源码中出现了大量事件消息,可以说整个tomcat的启动流程都可以通过事件派发机制串起来,研究透了tomcat的各种事件消息,基本上对tomcat的启动流程也就有了一个整体的认 ...
- Spring 中的事件机制
说到事件机制,可能脑海中最先浮现的就是日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作.这些listener是怎 ...
- nodeJS中的事件机制
events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Node.js ...
- javascript 中的事件机制
1.javascript中的事件. 事件流 javascript中的事件是以一种流的形式存在的. 一个事件会也有多个元素同时响应. 有时候这不是我们想要的效果, 我们只是需要某个特定的元素相应我们的绑 ...
- libevent中的事件机制
libevent是事件驱动的网络库,事件驱动是他的核心,所以理解事件驱动对于理解整个网络库有很重要的意义. 本着从简入繁,今天分析下单线程最简单的事件触发.通过sample下的event- ...
- Flex中利用事件机制进行主程序与子窗体间参数传递
在开发具有子窗体,或者itemrenderer的应用时,常常涉及到子窗体向父窗体传递参数或者从itemrenderer内的控件向外部的主程序传递参数的需求.这些都可以通过事件机制这一统一方法加以解决. ...
- C#中的事件机制
这几天把事件学了一下,总算明白了一些.不多说了,直接代码. class Program { static void Main(string[] args) { CatAndMouse h = new ...
随机推荐
- Angular(2+) 国际化方案(ngx-translate)
本文只针对ngx-translate/core 6.x版本,如果你使用的是5.x或者更低的版本,请参照以下链接. https://github.com/ngx-translate/core/blob/ ...
- NopCommerce用core重写ef
最近看了NopCommerce源码,用core学习着写了一个项目,修改的地方记录下.项目地址 NopCommerce框架出来好久了.18年的第一季度 懒加载出来后也会全部移动到.net core.那么 ...
- 函数iconv_substr和mb_substr
二个函数iconv_substr和mb_substr,均可以在当前字符下进行字符串截取,以达到中文字符截取的不乱码. 应该如何选择呢? 1.iconv库在某些操作系统上可能运行不正确,需要安装GNU扩 ...
- 今天遇到了一个Spring出现的一个未知错误,分享下
异常内容: 未知错误[COM999] 使用环境:dubbo+SpringMVC+myBatis 解决方案:检查Spring配置文件,发现配置文件在注入Service的时候写错了 com.wu.wsf. ...
- linux 硬软链接区别
linux 硬软链接区别 linux的软连接(symbolic link or soft link)类似于windows的快捷方式:而硬链接(hard link)机制有点像copy,不过不同的是,带有 ...
- Linux网络设备驱动架构
Linux网络设备驱动程序体系结构分为四层:网络协议接口层.网络设备接口层.提供实际功能的设备驱动层以及网络设备与媒介层. (1)网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议是AR ...
- scrapy_全站爬取
如何查询scrapy有哪些模版? scrapy genspider –list 如何创建crawl模版? scrapy genspider -t crawl 域名 scrapy genspider - ...
- 微信小程序实战:天气预报
接触微信小程序也有一段时间了,以天气预报练一下手. 主要实现了以下功能: (1) 首页图标式菜单,便于以后扩展功能 (2)首页顶部滚动消息 (3)页面右上角三点菜单转发功能,便于小程序的传播 (4)天 ...
- Can’t open /dev/* exclusively. Mounted filesystem?解决
1 错误提示:Can’t open /dev/* exclusively. Mounted filesystem? 做完软件RAID之后,根据鸟哥书上的操作,其实没有真正删除软件RAID,导致出现如下 ...
- JAVA中发送电子邮件的方法
JAVA中发送邮件的方法不复杂,使用sun的JavaMail的架包就可以实现. 一.下载JavaMail的架包,并导入项目中,如下: 二.附上代码例子,如下: 1.在main函数中对各项参数进行赋值 ...