Qt入门(8)——事件和事件过滤器
在Qt里,一个事件是继承自QEvent的对象。事件通过调用QObject::event(),被发送到继承自 QObject 的对象。事件发送就是一个事件已经产生,由 QEvent正好去表达,且QObject 需要去回应。多数事件针对 QWidget和他的子类的,此外还有些不和图形相关的重要事件,比如,套接字激活,——某种被用于QSocketNotifier运作的事件。
某些事件来自窗口系统,如QMouseEvent,某些来自其他源头,如QTimerEvent,而某些来自应用程序。Qt一视同仁,因此像通常一样,你可以准确地发送事件,这和Qt自己的事件循环所作的方式一样。
多数事件类型具有特定的类,最常见的QResizeEvent、QPaintEvent、QMouseEvent、QKeyEvent和QCloseEvent。有很多别的,差不多40种左右,但大都是相当零碎。
每个类派生自QEvent且添加事件特定的函数;例如,QResizeEvent。在QResizeEvent中,就被加入了QResizeEvent::size()和QResizeEvent::oldSize()。
某些类支持多种事件类型。QMouseEvent支持鼠标移动、按压、粘滞按压、拖拽、点击、右按压,等等。
因为程序需要在多变且复杂的方式下作用,Qt的事件派发机制就是灵活的。QApplication::notify() 的文档扼要地叙述其整个来龙去脉,我们揭示在这里的内容满足99%的应用。
对于事件去被派发的正常的办法是调用一个虚拟函数。如,QPaintEvent通过调用QWidget::paintEvent()被使用。这个虚拟函数负责引起适当的响应,一般是重画窗口部件。
有时,并不存在一个特定事件函数,或者特定事件功能不足。最普通的例如按下tab键。正常情况下,被QWidget看成是去移动 键盘焦点,但少数窗口部件 需要自行解释。
这些对象能重新实现QObject::event(),按常规事件处理,以及要么在通常的处理之前,或之后处理,或完全重写。一个与众不同的的窗口部件,它解释了tab,也含有一个该应用特定的可能包含的自定制事件:
bool MyClass:event( QEvent * e ) {
if ( e->type() == QEvent::KeyPress ) {
QKeyEvent * ke = (QKeyEvent*) e;
if ( ke->key() == Key_Tab ) {
// 这里是特定的tab处理
k->accept();
return TRUE;
}
} else if ( e->type() >= QEvent::User ) {
QCustomEvent * c = (QCustomEvent*) e;
// 这里是自定义事件处理
return TRUE;
}
QWidget::event( e );
}
更一般的,一个对象需要去考虑其它的事件。Qt用QObject::installEventFilter()支持这个目的(相应的有移除)。如,对话框通常要为某些窗口部件去过滤按键,比如,去修改Return键的处理。
一个事件过滤器在目标对象处理之前得以去处理事件。过滤器的QObject::eventFilter()实现被调用,它可以接受或丢弃过滤,也可容许或拒绝进一步去处理事件。如果所有的事件过滤器允许进一步的处理事件,事件自己就被送达目标对象。如果它们之一停止处理,目标和任何后面的事件过滤器根本就对该事件一无所知了。
整个应用程序中过滤所有的事件也是可能的,通过在QApplication上安装一个事件过滤器。这里有QToolTip为了处理全部鼠标和键盘行为的实作。这个功能相当强大,但其在整个应用中也拖慢了每单个事件的派送,因此最好避免这种应用方式。
全局事件过滤器在对象特定的过滤器前被调用。
许多应用程序都要创建和发送他们自己的事件。
创建一种内置类型的事件是非常简单的:创建一个相应的类型的对象,然后调用QApplication::sendEvent()或者QApplication::postEvent()。
sendEvent() 立即处理事件——当sendEvent() 返回,(事件过滤器和)对象已经处理过事件了。对于很多事件类,调用isAccepted()函数,他告知你该事件能否被目前调用的处理者所接受或者拒绝。
postEvent()投送事件于一个队列,以使能延迟派发。在下次Qt的主事件循环运行,他派发全部事件,带有些优化。举例,若有数个resize事件,它们就被压缩到一个。对于paint事件同样如此:QWidget::update()调用 postEvent(),最小化闪屏和避免多次重画,以增加速度。
postEvent()在对象初始化期间常常被使用,因为在对象完成初始化后,投送的消息会被很快派发。
去创建一个自定义类型的事件,你需要定义一个事件号,其必须大于QEvent::User,可能你也需要从QCustomEvent去派生,为了传递有关你的自定义事件的特性。看QCustomEvent的文档了解细节。
Qt入门(8)——事件和事件过滤器的更多相关文章
- QT学习 之 事件与事件过滤器(分为五个层次)
事件 在Qt中,事件是作为对象处理的,所有事件对象继承自抽象类QEvent.此类用来表示程序内部发生或者来自于外部但应用程序应该知道的动作.事件能够能过被 QObject 的子类接受或者处理,但是通常 ...
- Qt入门学习——Qt 5 帮助文档的使用
Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...
- qt中的事件机制
事件 1.QEvent -->类型 -> QKeyEvent QEvent::KeyRelease QEvent::MouseMove -> QMouseEvent 2.事件处理过程 ...
- Qt之键盘事件监听-实时响应大小写Capslock按键
目录 一.开篇 二.效果展示 三.实现思路 1.重写QLlinEdit 2.全局应用程序事件 3.windows钩子 四.相关文章 原文链接:Qt之键盘事件监听-实时响应大小写Capslock按键 一 ...
- Qt中的事件
1. 引自---http://blog.sina.com.cn/s/blog_6e80f1390100pro4.html 信号和事件的区别就在与,事件比信号更加底层,而且如果一个信号对应多个槽的话,信 ...
- easelJS入门、事件、spritesheet
easelJS入门.事件.spritesheet <%@ page language="java" contentType="text/html; charset= ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
- Qt入门之基础篇(三):掌握Qt4的静态编译基本方法
转载载请注明出处:CN_Simo. 导语: 前两章都提到过“静态编译”(Static Compilation),在Windows下一次静态编译差不多需要长达三个小时才能完成,而且还非常容易由于各种原因 ...
- 【转】Qt鼠标键盘事件
http://blog.csdn.net/lovebird_27/article/details/50351336 Qt 程序需要在main()函数创建一个QCoreApplication对象,然后调 ...
随机推荐
- shell入门之流程控制语句 分类: 学习笔记 linux ubuntu 2015-07-10 16:38 89人阅读 评论(0) 收藏
1.case 脚本: #!/bin/bash #a test about case case $1 in "lenve") echo "input lenve" ...
- Android 布局
转自:http://www.cnblogs.com/chiao/archive/2011/08/24/2152435.html Android布局是应用界面开发的重要一环,在Android中,共有五种 ...
- Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题
该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...
- iOS Sqlite3 Demo 及 FMDB Demo
本文是主要实现了三个函数: testSQLite3 是测试系统自带的sqlite3的demo testFMDB是测试FMDB存取简单的数据类型的 的demo testFMDB2是将任意对象作为一个整体 ...
- 用户输出表单处理php
php中的表单输入处理,我用两个文件,在linux输出: touch php_post1.html php_post1.php php_post1.html代码如下: <!doctype htm ...
- [转] EF Configuring a DbContext
本文转自:https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext Note This document ...
- 10.4 noip模拟试题
题目名称 PA 青春 三部曲 名称 huakai taritari truetears 输入 huakai.in taritari.in truetears.in 输出 huakai.out tari ...
- 如何用visual studio控件(repeater)绑定数据库(SQL server)信息并显示
今天学习了下如何间接绑定数据库网上看了很多信息,都云里雾里,没有图片说明,初学者完全看不懂,我自己做了一个DEMO,相信可以帮到大家! 一.建立数据库,并构建表信息,我的表信息如下: 表中的数据在数据 ...
- 常用CDN公共库
Jquery <script src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></scrip ...
- 【转】iOS-Core-Animation-Advanced-Techniques(五)
原文:http://www.cocoachina.com/ios/20150105/10829.html 图层时间和缓冲 图层时间 时间和空间最大的区别在于,时间不能被复用 -- 弗斯特梅里克 在上面 ...