`
gaofen100
  • 浏览: 1218265 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

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

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

libqxt

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

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

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

QxtGlobalShortcut

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

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

用法

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

QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(QKeySequence("Ctrl+Shift+F12"), w);
connect(shortcut, SIGNAL(activated()), w, SLOT(myslot()));

注意:如果你对其内部实现不感兴趣,只关心如何使用,那么这个小例子可能就是你需要的全部了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的指针作为值保存起来。

bool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut)
{
...
    key = ...
    mods = ...
    const quint32 nativeKey = nativeKeycode(key);
    const quint32 nativeMods = nativeModifiers(mods);
    const bool res = registerShortcut(nativeKey, nativeMods);
    shortcuts.insert(qMakePair(nativeKey, nativeMods), &qxt_p());
...
  • 反注册的过程与此类似。

热键激活

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

QAbstractEventDispatcher::instance()->setEventFilter(eventFilter);

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

bool QCoreApplication::winEventFilter ( MSG * msg, long * result ) [virtual]

To handle system wide messages, such as messages from a registered hot key, you need to install an event filter on the event dispatcher, which is returned from QAbstractEventDispatcher::instance().
  • 然后我们在过滤器中分别进行处理,比如windows下

bool QxtGlobalShortcutPrivate::eventFilter(void* message)
{
    MSG* msg = static_cast<MSG*>(message);
    if (msg->message == WM_HOTKEY){
        const quint32 keycode = HIWORD(msg->lParam);
        const quint32 modifiers = LOWORD(msg->lParam);
        activateShortcut(keycode, modifiers);
    }
    return false;
}

或 x11 下:

bool QxtGlobalShortcutPrivate::eventFilter(void* message)
{
    XEvent* event = static_cast<XEvent*>(message);
    if (event->type == KeyPress){
        XKeyEvent* key = (XKeyEvent*) event;
        activateShortcut(key->keycode, key->state & (ShiftMask | ControlMask | Mod1Mask | Mod4Mask));
    }
    return false;
}

其中activateShortcut是平台无关的:

void QxtGlobalShortcutPrivate::activateShortcut(quint32 nativeKey, quint32 nativeMods)
{
    QxtGlobalShortcut* shortcut = shortcuts.value(qMakePair(nativeKey, nativeMods));
    if (shortcut && shortcut->isEnabled())
        emit shortcut->activated();
}

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

如何使用

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

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

HEADERS += $$PWD/qxtglobal.h /
           $$PWD/qxtglobalshortcut.h /
           $$PWD/qxtglobalshortcut_p.h
SOURCES += $$PWD/qxtglobalshortcut.cpp
win32{
    SOURCES += $$PWD/qxtglobalshortcut_win.cpp
    LIBS += -luser32
}
unix:SOURCES += $$PWD/qxtglobalshortcut_x11.cpp
mac:SOURCES += $$PWD/qxtglobalshortcut_mac.cpp

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

include(yourpath/qxtglobalshortcut.pri)

即可

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

参考

分享到:
评论

相关推荐

    QT第三方库全局快捷键热键.zip

    QT第三方库全局快捷键热键.zip是一个包含关于在Qt应用程序中使用全局快捷键(热键)的资源包。这个包特别关注的是一个名为qxtglobalshortcut5的第三方库,它是Qt的一个扩展,允许开发者创建可以在应用程序任何状态下...

    Qt全局热键,可用于绑定物理按键

    Qt全局热键(QHotkey)是Qt框架中用于实现应用程序全局快捷键功能的一个扩展库。这个库使得开发者能够绑定特定的物理按键组合,以便在应用程序的任何状态下触发相应的功能。在开发跨平台的桌面应用时,全局热键通常...

    QT5 全局热键完整demo

    QT5全局热键完整demo是基于QT5框架实现的一个示例程序,主要展示了如何在QT应用中设置和使用全局热键。全局热键,又称快捷键或系统热键,允许用户在应用程序之外,甚至在其他应用程序处于焦点时,通过特定的键盘组合...

    Qt全局热键 QtGlobalShortcut文档

    ### Qt全局热键 QtGlobalShortcut 文档解析 #### 概述 QtGlobalShortcut 是一个用于在 Qt 应用程序中实现全局热键功能的组件。它允许开发人员为应用程序定义一组热键,这些热键即使在应用程序没有焦点时也能响应。...

    qt全局热键 全平台 支持qt5

    qxtglobalshortcut是一个qt上的对系统全局热键的第三方的解决方案,完美跨平台,只是网上流传的代码都不能用在最新的qt 5.3.1,所以我就自己改写了一个,除了增加对qt5的支持外其他没有任何变化。

    QT学习之注册全局热键

    在网上收到的注册QT全局热键的方法,基本都不支持QT5,查了大量资料发现QT5不支持QAbstractEventDispatcher::EventFilter;参考资料进行了更改,使用如下:...

    qt全局热键demo

    【Qt全局热键Demo】是基于Qt框架的一个小型应用程序示例,它展示了如何在Qt环境中实现全局热键功能。全局热键,也称为系统热键或快捷键,是指在任何应用窗口激活的情况下,用户按下特定组合键都能触发相应操作的功能...

    Qt全局热键第三方库qxtglobalshortcut5,100%好用

    sudo apt-get install qtbase5-private-devQxt qxtglobalshortcut library qt5 compatibility Tested with qt5.4 on OSX 10.9.2, linux, windows (mingw and msvc)git clone ...#include &lt;QDebug&gt;#include ...

    [Qt Topic] – 全局热键、托盘功能和随机启动

    以上是关于Qt全局热键、托盘功能和随机启动的详细介绍,这些功能的运用可以使Qt应用程序更加符合用户的使用习惯,提供更加便捷的操作方式。在实际开发中,根据需求灵活运用这些技术,可以提高应用的用户满意度和实用...

    qxtglobalshortcut,Qt代码注册系统热键

    基于Qt的qxtglobalshortcut热键代码,网上下载到的是基于Qt4的,这个是经过修改的库,在Qt5上可以运行,使用可参考:https://blog.csdn.net/dbzhang800/article/details/6302816

    QT热键实现例程

    QxtGlobalShortcut是Qxt库的一部分,它提供了一种方法来设置全局热键,即使在QT应用程序的非焦点状态下也能响应。如果你的例程中使用了这个库,那么在主窗口之外,用户也可以触发设定的热键。使用QxtGlobalShortcut...

    Qt全局鼠标、键盘事件监听器库

    【Qt全局鼠标、键盘事件监听器库】是一个用于在Windows和Linux系统上实现跨平台的全局鼠标和键盘事件捕获的库。这个库基于流行的Qt框架,为开发者提供了一个便捷的方式来监听并处理系统的输入事件,无论是来自应用...

    QT 使用全局变量的方法 - 郭小郭的专栏 - CSDN博客1

    QT 使用全局变量的方法 在QT编程中,全局变量的使用有时是必要的,特别是在需要在不同类或函数之间共享数据的情况下。然而,全局变量的使用应该谨慎,因为它们可能破坏封装性和增加代码的复杂性。以下是两种在QT中...

    Qt全局热键

    linux windows mac 通用

    Qt5注册全局热键实现显示或隐藏对话框

    最近写Qt程序需要用到注册全局热键,百度了好多,也没有找到成功的(可能我用的是假百度吧),几天后,找到一个案例,终于成功。本文全部是基于这个例程进行编写的。正所谓,站在巨人的肩上! 尽量写的详细一点,使...

    全局热键全局热键

    1. **冲突避免**:由于全局热键在整个系统中生效,开发者需要确保所设定的热键不会与系统默认的热键或其他应用的热键冲突,否则可能导致意外的操作。 2. **正确处理消息**:当接收到热键触发的消息时,应用程序需要...

    QT全局快捷键第三方开源库

    这个库,称为QxtGlobalShortcut,是QT框架的扩展,它为开发者提供了简单易用的API来注册和管理全局快捷键,使得用户可以在任何应用窗口之外甚至应用程序最小化的情况下触发特定的功能。 首先,我们来深入了解QT框架...

    Qt全局观察者(多层窗体之间直接传递消息)-可传参

    总之,通过使用Qt的全局信号和槽机制,可以实现多层窗体之间的直接消息传递,提高代码的可维护性和效率。同时,灵活地利用元对象系统和线程安全机制,可以确保消息传递的正确性和实时性。这种技术在复杂的Qt应用开发...

    全局热键2.zip

    全局热键,也称为系统热键或快捷键,是计算机应用...通过分析这些代码,开发者不仅可以学会如何在Qt应用中设置全局热键,还能进一步掌握Qt事件处理和信号槽机制,这对于任何想要深入Qt开发的程序员都是非常有价值的。

    全局热键1.zip

    全局热键是软件开发中的一个重要概念,特别是在GUI应用程序中,它可以增强用户交互体验。...通过学习和分析这些示例代码,开发者可以掌握在Qt中实现全局热键的方法,并将其应用到自己的项目中,提升应用的用户体验。

Global site tag (gtag.js) - Google Analytics