Qt 中如何捕获窗口停用和激活的消息
最近一直在用Qt做一个简单的俄罗斯方块的游戏,由于要实现一个暂停游戏的功能,就是当鼠标移出正在运行的游戏,点击电脑桌面上的其他位置时,这个时候游戏暂停。在这里把实现过程简单的记录一下,作为一个学习笔记,如果有什么错误之处,还希望大家指出,共同提高,谢谢!
刚开始的时候,我很自然的想到要实现这个功能,只要重载一下下面的这个函数:
- void QWidget::focusOutEvent ( QFocusEvent * event ) [virtual protected]
我赶紧的测试一下,但是发现并没有实现我想要得功能,而且当我的鼠标离开正在运行的游戏,点击电脑桌面上其他的位置时,focusOutEvent这个事件并没有被触发(重载的时候,我在这个函数里面加啦一句打印的,如果触发啦这个事件,会有一个打印的)。
在网上搜索啦一些资料,发现这其实是基础知识不扎实的表现,我们先来认识与区别一下前景窗口(Foreground Window),活动窗口(Active) 。
任何一个时候,我们的Windows桌面上总有一个最前台的窗口,其实说简单的,就是标题栏变成深蓝色的那个窗口,仅此一个,这个窗口就是前景窗口(Foreground Window),其他窗口就是后台窗口(Background Window)。那创建前景窗口的线程就是前景线程(Foreground Thread),这个线程并不一定就是应用程序的主线程。
线程内部会维护当前自己的活动窗口(Active Window)和焦点窗口(Focus Window), 焦点窗口其实只是窗口的一个属性,其实就是“焦点状态”是窗口的一个属性,而焦点窗口的顶层窗口就是活动窗口,举个例子:一个对话框中有一个按钮,当按钮 获得焦点的时候,那此按钮就是焦点窗口,则包含此按钮的对话框就是活动窗口,若出现窗口嵌套的情况,则最根的那个窗口才是活动窗口。(以上文字引自开头的文章 )
通过上面的文字我们可以看出,焦点窗口是一个局部的概念,我所要实现的点击桌面上其他位置时其实是让当前活动窗口(Active)变为不不活动的窗口。所以通过上面的重载focusOutEvent这个函数,是绝对不可能达到要求的。
又仔细搜寻啦Qt文档,发现里面有
QEvent::WindowDeactivate
QEvent::WindowActivate
这样两个QEvent::Type枚举类型的值,这正好是我们要的活动窗口(Active)与不不活动的窗口事件切换的标签,Qt中没有留出这样的事件的接口,我们通过重载下面这个函数:
bool QObject::eventFilter ( QObject * watched, QEvent * event ) [virtual]
安装一个事件过滤器,来处理。
- class MyWidget : QWidget //
- {
- prviate:
- public:
- MyWindget();
- protected:
- bool eventFilter(QObject *o, QEvent *e);//事件过滤器
- }
- MyWidget::MyWidget()
- {
- QWidget::installEventFilter(this);//为这个窗口安装过滤器
- }
- 在类中重载eventFilter函数:
- bool MyWidget::eventFilter(QObject *watched, QEvent *event)
- {
- if( watched == this )
- {
- //窗口停用,变为不活动的窗口
- if(QEvent::WindowDeactivate == event->type())
- {
- //
- //DEBUGP( "eventFilter" ) ;
- hide(); //或者关闭窗口,加入自己的操作.
- return true ;
- }
- else
- {
- return false ;
- }
- }
- return false ;
- }
再次进行测试,发现完美实现我想要得功能!很happy!
参考:http://blog.csdn.net/xj178926426/article/details/7188246
Qt 中如何捕获窗口停用和激活的消息的更多相关文章
- Qt中的主窗口之菜单栏
1.Qt中的主窗口 主窗口为建立应用程序用户界面提供了一个框架 Qt开发平台中直接支持主窗口的概念 QMainWindow是Qt中主窗口的基类 QMainWindow继承于QWidget是一种容器类型 ...
- Qt5:Qt中屏幕或窗口截图功能的实现
要想在Qt中实现屏幕或窗口截图功能 ,通常有两种方法: 1 -- 使用 QPixmap 类 2 -- 使用 QScreen类 然而虽然俩两种方法用到的类不相同,但是调用到的类成员函数的函数名称和参 ...
- 如何在Qt中处理(接收/发送)MFC或Windows消息(直接覆盖MainDialog::nativeEvent,或者QApplication::installNativeEventFilter安装过滤器,或者直接改写QApplication::nativeEventFilter)
关于接收: Receive WM_COPYDATA messages in a Qt app. 还有个中文网站: 提问: 如何在Qt中模拟MFC的消息机制 关于发送: 用Qt在Windows下编程,如 ...
- Qt中如何固定窗口的大小?
这个是从网上转载过来的,我第一次看到的在如下网页:http://blog.csdn.net/cgb0210/article/details/5712980 这里我记录一下,留以后查阅. 一种方法是设 ...
- 3.关于QT中的MainWindow窗口,MenuBar,ToolBar,QuickTip等方面的知识点
1 新建一个空Qt项目 编写12MainWindow.pro HEADERS += \ MyMainWindow.h \ MyView.h SOURCES += \ MyMainWindow.c ...
- Qt中重绘制窗口方法:
void CircleWidget::paintEvent(QPaintEvent * event) { QPainter painter(this); int wight = this->wi ...
- Qt中各个widget前后位置的设定(在Qt中,所有问题都要一分为二,QWidget体系和QGraphicsWidget体系)
这两天在总结一些以往project中遇到的问题,正好别组有同事问我关于Qt中各个widget窗口的前后位置是如何定义的,这里就总结一下: 在Qt中,所有问题都要一分为二,讨论两种不同的情况:一个是最常 ...
- Qt中常用知识点
1:QRegExp 正则表达式 QRegExp regExp("[a-zA-Z][1-9][0-9]{0,2}"); xxx->setValidator(new QRegEx ...
- Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法
之前在做有关QDockWidget的内容时候遇到了瓶颈,那就是窗口弹出来之后拖动不了,也不可以放大和缩小,若是弹出来之后设置成了window的flags,也不可以拖动,而且也不是需要的效果. 1.弹出 ...
随机推荐
- js事件防止冒泡
原文连接:http://www.cnblogs.com/jams742003/archive/2009/08/29/1556187.html 1. 事件目标 如今.事件处理程序中的变量event保存着 ...
- Java 日志缓存机制的实现--转载
概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...
- Maven常用插件--转
=========Maven Report Plugin========= 1.源码分析 <artifactId>maven-pmd-plugin</artifactId> 2 ...
- 笔试之STL
1. map是如何实现的?它的keys是否经过排序?如何实现它的clear方法? A 实现: map是通过红黑树来实现的,keys是经过排序的: map的所有元素都是pair,同时拥有实值(value ...
- C/C++ Linux 程序员必须了解的 10 个工具
1. 基本命令http://mally.stanford.edu/~sr/computing/basic-unix.htmlhttp://pangea.stanford.edu/computing/u ...
- YYCache 源码分析(二)
本文分析YYMemoryCache实现原理: YYMemoryCache是内存缓存,所以存取速度非常快,主要用到两种数据结构的LRU淘汰算法 1.LRU Cache的容量是有限的,当Cache的空间都 ...
- php declare (ticks = N)
A tick is an event that occurs for every N low-level tickable statements executed by the parser with ...
- Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感
第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的 ...
- Android 连接 SQL Server (jtds方式)——上
本文将介绍开发Android程序,连接SQL Server,通过第三方包jtds的方式. 如果你有同样的需求,请跟着做一遍,博主将以最详细的方式,进行介绍. 首先说明,Java.Android连接SQ ...
- JAVA集合差异
接口 简述 实现 操作特性 成员要求 Set 成员不能重复 HashSet 外部无序地遍历成员 成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法. T ...