Re: [問題] 請問關於Qt判斷按鍵事件的功能
※ 引述《googled (15357)》之銘言:
: 不好意思,小弟在這裡有一問題請教
: 關於Qt的按鍵事件判斷是在void keyPressEvent(QKeyEvent* e);
: 來完成,小弟本身設計的程式要選取一些Label如果按住Ctrl的話可以實現多選
: 所以我就這樣設計
: void keyPressEvent(QKeyEvent* e){
: if( e->key() == Qt::Key_Control)
: isCtrlPress=true;
: }
: void keyReleaseEvent(QKeyEvent* e){
: if( e->key() == Qt::Key_Control)
: isCtrlPress=false;
: }
: 本來這樣是沒有什麼問題,當我滑鼠在點Label的時候會去判斷
: isCtrlPress是不是等於true
: 可是小弟的程式的Menu有弄快捷鍵功能
: 如圖:http://ppt.cc/lbYW
: 所以當我按下Ctrl的時候isCtrlPress會變True,
: 可是如果我又按下O,然後設定的選單就會跳出來,
: 接著程式焦點就會跑到設定的視窗上
: 這時如果再放開Ctrl的話,isCtrlPress就不會變成false了
: 因為按鍵的事件判斷是在主視窗來偵測的,
: 當按了其他功能視窗的快捷鍵,就沒辦法進行按鍵偵測了
: 我本來有想過要在其他的視窗也都補上按鍵事件的處理
: 可是感覺有點無腦@@
: 想請問各位高手有沒有其他更好的建議,
: 或者是Qt有沒有提供那種隨時可以判斷某按鍵目前是否按下的功能
: 謝謝各位
Qt 裡的所有事件都是從 QCoreApplication (或其子類) 開始 propagate
所以你只要能攔截送至 QCoreApplication 的事件
就能在任何時刻獲得任何事件, 當然按鍵是其中一種
http://mobile.51cto.com/symbian-273119.htm
這篇文章對 Qt 的 event system 有頗詳盡的解說
看完上面那篇之後
我們可以知道在 GUI app 中
要捕捉全域按鍵事件基本上有三種做法:
1. 複寫 QApplication::event()
2. 複寫 QApplication::notify()
3. 對 application instance 安裝 event filter
除非你有特殊需求, 否則 event filter 通常都是最佳選擇
因為 you should (usually) prefer composition over inheritance[1]
C++ 要寫一堆 header 檔很麻煩, 所以我以下用 PySide 舉例
語法應該不難看懂, 大不了當 pseudocode 就是了
可能會有問題的地方:
1. Python 的 instance method 第一個傳入值 self 相當於 C++ 的 this,
所以你會看到每一個 method 都比 C++ 版多一個引數
2. super 的那行代表呼叫父類別的實作
3. 在 C++ 中, eventFilter 得到的 event object 是 QEvent * instance,
所以你要手動轉型 (用 static_cast 就可以了, 如果當掉就向 Qt 回報 bug)
成 QKeyEvent * 才能獲得 key() 的值
https://gist.github.com/uranusjr/6775945
在這個例子裡我創造了一個 QObject subclass, 實作 eventFiler method
當 event 類型是按鍵 press/release, 且按鍵是 control 時印出 log
接著在第 27 行把這個 event filter install 到 QApplication 實例中
為了驗證這個 filter 不會影響到快捷鍵
我另外建立了一個 window, 然後在 control+o 被按下時印出 log
這部分應該沒什麼特別的
值得注意的是 eventFilter 需要有回傳值
根據文件, 當回傳 True 時該 event 會被 event filter 吃掉
由於我們只想在 control 鍵有變化時被告知, 並不希望其他人無法接收這個變化
所以這裡我們是回傳 False
[1] http://stackoverflow.com/questions/49002/
--
作者 Linux (Windows) 看板 C_and_CPP
標題 [問題] 如何確認是否 free 對記憶體
時間 Fri Nov 2 00:14:03 2012
→
11/02 00:43,
11/02 00:43
→
11/02 00:44,
11/02 00:44
→
11/02 00:45,
11/02 00:45
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.94.57
※ 編輯: uranusjr 來自: 140.112.94.57 (10/01 17:35)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):