Qt 中捕获窗口停用和激活的消息 .

来源:互联网 发布:淘宝健身球 编辑:程序博客网 时间:2024/06/05 04:04

最近一直在用Qt做一个简单的俄罗斯方块的游戏,由于要实现一个暂停游戏的功能,就是当鼠标移出正在运行的游戏,点击电脑桌面上的其他位置时,这个时候游戏暂停。在这里把实现过程简单的记录一下,作为一个学习笔记,如果有什么错误之处,还希望大家指出,共同提高,谢谢!
刚开始的时候,我很自然的想到要实现这个功能,只要重载一下下面的这个函数:

[cpp] view plaincopyprint?

 


我赶紧的测试一下,但是发现并没有实现我想要得功能,而且当我的鼠标离开正在运行的游戏,点击电脑桌面上其他的位置时,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]
安装一个事件过滤器,来处理。

[cpp] view plaincopyprint?

再次进行测试,发现完美实现我想要得功能!很happy!
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 c1本扣满12分怎么办 太原公共自行车丢了怎么办 在太原出租车丢了东西怎么办 太原社保卡丢了怎么办 太原铁路医保卡丢了怎么办 学车体检视力不合格怎么办 换驾照色弱被拒怎么办 在上海考驾照贵怎么办 驾驶证有效期过了半年怎么办 资格证脱审2年了怎么办 换驾驶证时眼睛近视了怎么办 违章累计扣12分怎么办 一个违章扣12分怎么办 a1驾照扣3分怎么办 a1驾照扣12分怎么办 吃了毓婷哺乳了怎么办 吃了毓婷后出血怎么办 吃金毓婷喝了水怎么办 白带浓稠浆糊样怎么办 驾校学费不给退怎么办 b1驾证扣了9分怎么办 机动车登记证丢了怎么办 b1驾照扣了9分怎么办 听力正常体检不过关怎么办 做完人流第二天同房了怎么办 医院的票据丢了怎么办 体检人体成分(脂肪缺乏)该怎么办 诊断出右下叶肺炎怎么办 做胸透穿钢圈内衣怎么办 预约不上留学体检怎么办 跨省离职后社保怎么办 开车到成都限号怎么办 月经量多怎么办吃什么 报驾校体检视力不达标怎么办 换驾驶证c1一只眼不合格怎么办 考驾照紧张腿抖怎么办 驾照该换了色弱怎么办 怀孕5个月感冒咳嗽怎么办 怀孕4个月喉咙痛怎么办 怀孕5个多月总是咳嗽尿失禁怎么办 怀孕7个月感冒了怎么办