Re: [問題] 請問關於Qt判斷按鍵事件的功能

看板C_and_CPP作者 (←這人是超級笨蛋)時間10年前 (2013/10/01 17:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
※ 引述《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,
valgrind, 但 windowns 版的沒試過XD
11/02 00:43

11/02 00:44,
linux 上那真的是不二選擇了
11/02 00:44

11/02 00:45,
我是用 Windows ....>"<
11/02 00:45
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.94.57 ※ 編輯: uranusjr 來自: 140.112.94.57 (10/01 17:35)
文章代碼(AID): #1IIfQfp0 (C_and_CPP)
文章代碼(AID): #1IIfQfp0 (C_and_CPP)