• QT全局热键(用nativeKeycode封装API,不跨平台)


    在网上找了很长时间,大家都提到了一个QT全局热键库(qxtglobalshortcut),支持跨平台。在这篇文章中,我将只展示出windows平台下全局热键的设置。 
    这里提供的方法是在MyGlobalShortCut里面完成Windows的API封装,并在main.cpp中使用。 
    直接上代码: 
    MyWinEventFilter类:

    class MyWinEventFilter :public QAbstractNativeEventFilter 

    public:

    MyWinEventFilter(MyGlobalShortCut *shortcut);
    ~MyWinEventFilter();
    virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long*);
    

    private:

    MyGlobalShortCut *m_shortcut;
    

    };

    MyWinEventFilter::MyWinEventFilter(MyGlobalShortCut* shortcut) :m_shortcut(shortcut) 
    {} 
    MyWinEventFilter::~MyWinEventFilter() 
    {} 
    bool MyWinEventFilter::nativeEventFilter(const QByteArray &eventType, void message, long
    {

    MSG *msg = static_cast(message);//static_cast<MSG*>(message)(把这段替换)
    if (msg->message == WM_HOTKEY)
    {
        const quint32 keycode = HIWORD(msg->lParam);
        const quint32 modifiers = LOWORD(msg->lParam);
        bool res = m_shortcut->shortcuts.value(qMakePair(keycode, modifiers));
        if (res)
        {
            m_shortcut->activateShortcut();
            return true;
        }
    }
    return false;
    


    MyGlobalShortCut类: 
    class MyGlobalShortCut :public QObject 

    Q_OBJECT 
    public:

    MyGlobalShortCut(QKeySequence key);
    ~MyGlobalShortCut();
    void activateShortcut();
    bool registerHotKey();
    bool unregisterHotKey();
    QHash<QPair<quint32, quint32>, MyGlobalShortCut*> shortcuts;
    

    private:

    QApplication *m_app;
    MyWinEventFilter *m_filter;
    QKeySequence m_key;
    Qt::Key key;
    Qt::KeyboardModifiers mods;
    static quint32 nativeKeycode(Qt::Key keycode);
    static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers);
    

    signals:

    void activated();
    

    };

    MyGlobalShortCut::MyGlobalShortCut(QKeySequence key) 
    {

    m_key = QKeySequence(key);
    m_filter = new MyWinEventFilter(this);
    m_app->installNativeEventFilter(m_filter);
    registerHotKey();
    

    }

    MyGlobalShortCut::~MyGlobalShortCut() 
    {

    unregisterHotKey();
    

    }

    void MyGlobalShortCut::activateShortcut() 
    {

    emit activated();
    

    }

    bool MyGlobalShortCut::registerHotKey() 
    {

    Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;
    key = (m_key.isEmpty() ? Qt::Key(0) : Qt::Key((m_key[0] ^ allMods) & m_key[0]));
    mods = m_key.isEmpty() ? Qt::KeyboardModifiers(0) : Qt::KeyboardModifiers(m_key[0] & allMods);
    const quint32 nativeKey = nativeKeycode(key);
    const quint32 nativeMods = nativeModifiers(mods);
    
    shortcuts.insert(qMakePair(nativeKey, nativeMods), this);
    return RegisterHotKey(0, nativeMods ^ nativeKey, nativeMods, nativeKey);
    

    }

    bool MyGlobalShortCut::unregisterHotKey() 
    {

    return UnregisterHotKey(0, (quint32)nativeModifiers(mods) ^ (quint32)nativeKeycode(key));
    

    }

    quint32 MyGlobalShortCut::nativeKeycode(Qt::Key key) 
    {

    switch (key)
    {
    case Qt::Key_Escape:
        return VK_ESCAPE;
    case Qt::Key_Tab:
    case Qt::Key_Backtab:
        return VK_TAB;
    case Qt::Key_Backspace:
        return VK_BACK;
    case Qt::Key_Return:
    case Qt::Key_Enter:
        return VK_RETURN;
    case Qt::Key_Insert:
        return VK_INSERT;
    case Qt::Key_Delete:
        return VK_DELETE;
    case Qt::Key_Pause:
        return VK_PAUSE;
    case Qt::Key_Print:
        return VK_PRINT;
    case Qt::Key_Clear:
        return VK_CLEAR;
    case Qt::Key_Home:
        return VK_HOME;
    case Qt::Key_End:
        return VK_END;
    case Qt::Key_Left:
        return VK_LEFT;
    case Qt::Key_Up:
        return VK_UP;
    case Qt::Key_Right:
        return VK_RIGHT;
    case Qt::Key_Down:
        return VK_DOWN;
    case Qt::Key_PageUp:
        return VK_PRIOR;
    case Qt::Key_PageDown:
        return VK_NEXT;
    case Qt::Key_F1:
        return VK_F1;
    case Qt::Key_F2:
        return VK_F2;
    case Qt::Key_F3:
        return VK_F3;
    case Qt::Key_F4:
        return VK_F4;
    case Qt::Key_F5:
        return VK_F5;
    case Qt::Key_F6:
        return VK_F6;
    case Qt::Key_F7:
        return VK_F7;
    case Qt::Key_F8:
        return VK_F8;
    case Qt::Key_F9:
        return VK_F9;
    case Qt::Key_F10:
        return VK_F10;
    case Qt::Key_F11:
        return VK_F11;
    case Qt::Key_F12:
        return VK_F12;
    case Qt::Key_F13:
        return VK_F13;
    case Qt::Key_F14:
        return VK_F14;
    case Qt::Key_F15:
        return VK_F15;
    case Qt::Key_F16:
        return VK_F16;
    case Qt::Key_F17:
        return VK_F17;
    case Qt::Key_F18:
        return VK_F18;
    case Qt::Key_F19:
        return VK_F19;
    case Qt::Key_F20:
        return VK_F20;
    case Qt::Key_F21:
        return VK_F21;
    case Qt::Key_F22:
        return VK_F22;
    case Qt::Key_F23:
        return VK_F23;
    case Qt::Key_F24:
        return VK_F24;
    case Qt::Key_Space:
        return VK_SPACE;
    case Qt::Key_Asterisk:
        return VK_MULTIPLY;
    case Qt::Key_Plus:
        return VK_ADD;
    case Qt::Key_Comma:
        return VK_SEPARATOR;
    case Qt::Key_Minus:
        return VK_SUBTRACT;
    case Qt::Key_Slash:
        return VK_DIVIDE;
    
        // numbers
    case Qt::Key_0:
    case Qt::Key_1:
    case Qt::Key_2:
    case Qt::Key_3:
    case Qt::Key_4:
    case Qt::Key_5:
    case Qt::Key_6:
    case Qt::Key_7:
    case Qt::Key_8:
    case Qt::Key_9:
        return key;
    
        // letters
    case Qt::Key_A:
    case Qt::Key_B:
    case Qt::Key_C:
    case Qt::Key_D:
    case Qt::Key_E:
    case Qt::Key_F:
    case Qt::Key_G:
    case Qt::Key_H:
    case Qt::Key_I:
    case Qt::Key_J:
    case Qt::Key_K:
    case Qt::Key_L:
    case Qt::Key_M:
    case Qt::Key_N:
    case Qt::Key_O:
    case Qt::Key_P:
    case Qt::Key_Q:
    case Qt::Key_R:
    case Qt::Key_S:
    case Qt::Key_T:
    case Qt::Key_U:
    case Qt::Key_V:
    case Qt::Key_W:
    case Qt::Key_X:
    case Qt::Key_Y:
    case Qt::Key_Z:
        return key;
    
    default:
        return 0;
    }
    

    }

    quint32 MyGlobalShortCut::nativeModifiers(Qt::KeyboardModifiers modifiers) 
    {

    // MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN
    quint32 native = 0;
    if (modifiers & Qt::ShiftModifier)
        native |= MOD_SHIFT;
    if (modifiers & Qt::ControlModifier)
        native |= MOD_CONTROL;
    if (modifiers & Qt::AltModifier)
        native |= MOD_ALT;
    if (modifiers & Qt::MetaModifier)
        native |= MOD_WIN;
    return native;
    


    ////////////////////////////////////////////////////////////////////////////////////////////// 
    上面是类的封装,下面是使用: 
    在main()函数中加入:

    QKeySequence keySequence=QKeySequence(tr(“ALT+A”));//设置快捷键ALT+A 
    MyGlobalShortCut *shortcut=new MyGlobalShortCut(keySequence); 
    connect(shortcut,SIGNAL(activated()),this,SLOT(onActivated()));

    onActivated() 

    //全局热键被激活之后要做的事 

    这只是针对windows系统的实现,由于工作中现在只涉及windows,其他系统类似,主要就是实现nativeEventFilter()方法。 
    ///////////////////////////////////////////////////////////////////////////////////////////// 
    (全文完)

    http://blog.csdn.net/u011915578/article/details/46491055

  • 相关阅读:
    小程序swiper组件实现间距轮播
    小程序form静态页面跳转
    批量添加Iconfont图标库图标
    Vant Weapp 有赞小程序UI库 ICON 组件的本地图标路径支持
    $rootScope、$apply、$watch
    EF code first 数据模型创建数据库
    angularjs directive2
    angularjs directive
    angularjs service
    angular repeat
  • 原文地址:https://www.cnblogs.com/findumars/p/5068063.html
Copyright © 2020-2023  润新知