成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解 Qt 全局熱鍵 QxtGlobalShortcut 分析與使用舉例

移動開發
本文介紹Qt 全局熱鍵 QxtGlobalShortcut 分析與使用舉例 ,不少人有給程序添加全局熱鍵的需求。網上隨便一搜,就能找到不少介紹windows下如何實現的方式,請看內容。

Qt 全局熱鍵 QxtGlobalShortcut 分析與使用舉例,與你分享,如果你需要全局熱鍵,那么本文將會為你解決。

首先: 使用 RegisterHotKey和 UnregisterHotKey 注冊和反注冊熱鍵

其次: 在事件全局過濾器 winEventFilter 中相應熱鍵,但是涉及其他平臺的,中文資料中提到的似乎不多。

libqxt

其實Qt第三方的庫 libqxt 中已經給出了一個比較好的跨平臺的解決方案,這就是 QxtGlobalShortcut。

所以,只要你使用這個第三方庫就可以了。

可是,你會不會想,我僅僅為了使用這個類,而引入這個 libqxt 第三方庫是不是有點大題小做?我能不能將其剝離出來單獨使用?

QxtGlobalShortcut

恩,用google搜索一下,就可以知道,網上很多人都做過這個工作了。你會發現很多人將剝離出的 QxtGlobalShortcut 作為項目的 3rdparty 部分。

那么我們接下來就看看這個 QxtGlobalShortcut :

用法

已經簡單到不能再簡單了,是不?

  1. 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=

源碼文件

  1. gxtglobal.h  

libqxt 一個全局文件

  1. qxtglobalshortcut.h  

我們最關心的接口文件

  1. qxtglobalshortcut_.h  

私有頭文件

  1. gxtglobalshortcut.cpp  

類的實現(平臺無關部分)

  1. gxtglobalshortcut_win.cpp  

類的實現(win)

  1. gxtglobalshortcut_x11.cpp  

類的實現(x11)

  1. gxtglobalshortcut_mac.cpp  

類的實現(mac)

熱鍵的注冊過程

我們通過構造函數,或者setShortcut 成員設置一個熱鍵時:

首先將這個 QKeySequence 分解成兩部分 Qt::Key 和 Qt::KeyboardModifiers

(即:下面的 key 和 mods)

然后,key 和 mods 分別轉換成平臺相關(native)的碼值,并調用平臺相關的函數進行注冊

最后,將key與mods的native碼值構成的QPair作為QHash的鍵,將該shortcut的指針作為值保存起來。 

  1. bool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut)  
  2. {  
  3. ...  
  4.     key = ...  
  5.     mods = ...  
  6.     const quint32 nativeKey = nativeKeycode(key);  
  7.     const quint32 nativeMods = nativeModifiers(mods);  
  8.     const bool res = registerShortcut(nativeKey, nativeMods);  
  9.     shortcuts.insert(qMakePair(nativeKey, nativeMods), &qxt_p()); 

反注冊的過程與此類似。

熱鍵激活

首先給 QAbstractEventDispatcher 安裝事件過濾器

  1. QAbstractEventDispatcher::instance()->setEventFilter(eventFilter);注意,這兒不是給 QApplication 安裝的。Manual中是這樣告訴我們的  
  2. bool QCoreApplication::winEventFilter ( MSG * msg, long * result ) [virtual]  
  3. To handle system wide messages, such as messages from a registered hot key, 
  4. you need to install an event filter on the event dispatcher, 
  5. which is returned from QAbstractEventDispatcher::instance().然后我們在過濾器中分別進行處理,比如windows下   
  6. bool QxtGlobalShortcutPrivate::eventFilter(void* message)  
  7. {  
  8.     MSG* msg = static_cast<MSG*>(message);  
  9.     if (msg->message == WM_HOTKEY){  
  10.         const quint32 keycode = HIWORD(msg->lParam);  
  11.         const quint32 modifiers = LOWORD(msg->lParam);  
  12.         activateShortcut(keycode, modifiers);  
  13.     }  
  14.     return false;  
  15. }  
  16. 或 x11 下:  
  17. bool QxtGlobalShortcutPrivate::eventFilter(void* message)  
  18. {  
  19.     XEvent* event = static_cast<XEvent*>(message);  
  20.     if (event->type == KeyPress){  
  21.         XKeyEvent* key = (XKeyEvent*) event;  
  22.         activateShortcut(key->keycode, key->state & (ShiftMask | ControlMask | Mod1Mask | Mod4Mask));  
  23.     }  
  24.     return false;  

其中activateShortcut是平臺無關的:

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

記得前面注冊熱鍵是保存東西到一個QHash么?它是在這兒起作用的,當一個熱鍵到來時,我們從該QHash查找有沒有相應的QxtGlobalShortcut存在,存在且啟用的話,則發射信號。

如何使用

為了便于使用,我們可以在這個文件的同級目錄中添加一個 qxtglobalshortcut.pri 的文件:

  1. INCLUDEPATH += $$PWD  
  2. DEPENDPATH += $$PWD  
  3.  
  4. HEADERS += $$PWD/qxtglobal.h \  
  5.            $$PWD/qxtglobalshortcut.h \  
  6.            $$PWD/qxtglobalshortcut_p.h  
  7. SOURCES += $$PWD/qxtglobalshortcut.cpp  
  8. win32{  
  9.     SOURCES += $$PWD/qxtglobalshortcut_win.cpp  
  10.     LIBS += -luser32  
  11. }  
  12. unix:SOURCES += $$PWD/qxtglobalshortcut_x11.cpp  
  13. 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 全局熱鍵 QxtGlobalShortcut 分析與使用舉例的內容為大家介紹完了,希望你幫你解決問題。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-03-23 15:58:50

全局熱鍵QtWindows

2011-06-28 16:18:24

Qt QObject

2011-06-24 10:05:51

QT 對象 父對象

2010-07-05 11:40:12

GRE協議

2009-11-10 16:20:25

VB.NET全局熱鍵

2011-06-24 09:39:05

2011-07-04 15:48:57

Qt 桌面

2023-02-02 09:13:12

Hive壓縮使用性能分析

2011-09-01 15:10:22

Qt數據庫SQL

2011-06-22 13:27:04

QT QMap

2011-06-21 17:23:40

QT 編譯

2011-06-28 10:03:37

Qt OpenCV qmake

2011-06-30 10:50:39

Qt OpenCV

2011-07-01 12:52:50

Ubuntu Qt wxWidgets

2011-06-24 17:22:29

Qt Quick QML

2021-12-27 09:20:13

事務模式隔離

2010-12-16 10:00:20

QtVisual Stud

2011-07-04 14:29:25

Qt Designer 容器

2011-06-20 17:33:58

Qt MeegoTouch Maemo

2011-06-28 15:01:01

Qt PIMPL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品区一区二 | 亚洲国产精品久久久 | 国产超碰人人爽人人做人人爱 | 久久噜噜噜精品国产亚洲综合 | 96国产精品久久久久aⅴ四区 | 久久久久国产精品一区二区 | 欧美专区在线 | 天天射影院 | 日本黄色影片在线观看 | 欧美激情国产日韩精品一区18 | 日韩成人在线播放 | 国产精品一区二区三区久久 | 国产精品日韩欧美一区二区三区 | 91视频入口 | 午夜看片 | 成人免费视频 | 99色在线| 久久精品中文 | 欧美日韩在线免费观看 | 久久久.com| 翔田千里一区二区 | 日日操操操 | 欧美日本韩国一区二区 | 国产伦精品一区二区三区四区视频 | 黄色网毛片 | 欧洲毛片| 亚洲精品久久久蜜桃网站 | 午夜影视| 中文字幕一区在线观看视频 | 欧美成人a∨高清免费观看 欧美日韩中 | 久久久久91 | av一区二区三区 | 欧美1级| 亚洲 中文 欧美 | 亚洲天堂中文字幕 | 精品中文字幕一区二区三区 | 久久国产精品一区二区 | 国产精品不卡一区二区三区 | 黄网站免费在线观看 | 四虎影院在线免费观看 | 国产精品久久久久久久久 |