Qt 全局热键 QxtGlobalShortcut 分析与使用举例

作者: littlesu 分类: Qt Gui 发布时间: 2013-01-16 15:26 ė5,058 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

 

不少人有给程序添加全局热键的需求。网上随便一搜,就能找到不少介绍windows下如何实现的方式:

  • 首先: 使用 RegisterHotKey和 UnregisterHotKey 注册和反注册热键

  • 其次: 在事件全局过滤器 winEventFilter 中相应热键

但是涉及其他平台的,中文资料中提到的似乎不多。

libqxt

其实Qt第三方的库 libqxt 中已经给出了一个比较好的跨平台的解决方案,这就是 QxtGlobalShortcut。

所以,只要你使用这个第三方库就可以了。

可是,你会不会想,我仅仅为了使用这个类,而引入这个 libqxt 第三方库是不是有点大题小做?我能不能将其剥离出来单独使用?

QxtGlobalShortcut

恩,用google搜索一下,就可以知道,网上很多人都做过这个工作了。你会发现很多人将剥离出的 QxtGlobalShortcut 作为项目的 3rdparty 部分。

那么我们接下来就看看这个 QxtGlobalShortcut :

用法

已经简单到不能再简单了,是不?

注意:如果你对其内部实现不感兴趣,只关心如何使用,那么这个小例子可能就是你需要的全部了 http://code.google.com/p/h-qt-exercise/downloads/detail?name=shortcut.zip&can=2&q=

源码文件

 

gxtglobal.h

libqxt 一个全局文件

*

qxtglobalshortcut.h

我们最关心的接口文件

 

qxtglobalshortcut_.h

私有头文件

 

gxtglobalshortcut.cpp

类的实现(平台无关部分)

 

gxtglobalshortcut_win.cpp

类的实现(win)

 

gxtglobalshortcut_x11.cpp

类的实现(x11)

 

gxtglobalshortcut_mac.cpp

类的实现(mac)

热键的注册过程

我们通过构造函数,或者setShortcut 成员设置一个热键时:

  • 首先将这个 QKeySequence 分解成两部分 Qt::Key 和 Qt::KeyboardModifiers

    • (即:下面的 key 和 mods)
  • 然后,key 和 mods 分别转换成平台相关(native)的码值,并调用平台相关的函数进行注册
  • 最后,将key与mods的native码值构成的QPair作为QHash的键,将该shortcut的指针作为值保存起来。

 

  • 反注册的过程与此类似。

热键激活

  • 首先给 QAbstractEventDispatcher 安装事件过滤器

 

注意,这儿不是给 QApplication 安装的。Manual中是这样告诉我们的

  • 然后我们在过滤器中分别进行处理,比如windows下

 

或 x11 下:

其中activateShortcut是平台无关的:

记得前面注册热键是保存东西到一个QHash么?它是在这儿起作用的,当一个热键到来时,我们从该QHash查找有没有相应的QxtGlobalShortcut存在,存在且启用的话,则发射信号。

如何使用

为了便于使用,我们可以在这个文件的同级目录中添加一个 qxtglobalshortcut.pri 的文件:

这样一来,当我们使用时,只需要在我们的pro文件内多加一行:

即可

一个具体的小例子:http://code.google.com/p/h-qt-exercise/downloads/detail?name=shortcut.zip&can=2&q=

参考



只回答业务咨询点击这里给我发消息 点击这里给我发消息

学习日记,兼职软件设计,软件修改,毕业设计。

本文出自 学习日记,转载时请注明出处及相应链接。

本文永久链接: https://www.softwareace.cn/?p=42

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量