好久沒有來寫一些東西了,新的一年裡,寫部落格,可能會成為我的乙個計畫,不定期總結問題。
我喜歡在工作中,零星遇到的問題,或這有新的學習,我都會先使用為知筆記做下記錄,等後續有時間了,會整理成總結,放在這裡學習。也許簡單的幾行**只是為了增加記憶,但是時間久了再去回看也許就是自己的財富。
不囉嗦,說重點。
客戶需求:客戶端要支援設定快捷鍵以及通過快捷鍵操作,
環境:windows環境,qt開發的客戶端,多程序客戶端。
單程序客戶端處理方法:
qt很方便,直接為我們提供了接收鍵盤訊息的事件函式,我們重寫這些函式,然後做對應的處理,就可以了做到快捷鍵的功能。
1.重寫鍵盤事件
.**件,繼承qwidget等視窗,重寫函式。
virtual void keypressevent(qkeyevent *event)override;
.cpp檔案
#includevoid cwidget::keypressevent(qkeyevent *event)
}
2.使用qt函式介面setshortcut()新增,比如選單欄工具欄均可以通過新增addaction(),然後設定setshortcut快捷鍵。
qpushbutton *but = new qpushbutton(widget);
but->setshortcut(qkeysequence(qlatin1string("1")));
connect(but, &qpushbutton::clicked,
[=]()
);
以上的兩種方法比較常見,使用頻率也比較高,但是有時候並不能滿足我們。
重點:當前控制項沒有焦點時候怎麼辦?
這時候我們就需要通過其他方式了,先說簡單的。
使用qt的事件性質,對事件進行監聽,或者重寫最初的事件函式,攔截事件處理。
class myobject :public qobject
} return qobject::eventfilter(obj, event);
}};int main(int argc, char *ar**)
通過上面這種方法可以控制所有的qt事件,然後做處理。 }}
將獲取到的事件通知到對應的快捷鍵要處理的函式中,這樣就實現了快捷鍵功能。
3.使用windows的鉤子。
標頭檔案:
#pragma once
#include class cmywnd : public qwidget
;
原始檔:
#include "cmywnd.h"
#includehhook key_keep = null;
#define key_board_keyup 0x80000000
cmywnd *pmywnd;
lresult callback keyboardproc(int code, wparam wparam, lparam lparam)
return callnexthookex(0, code, wparam, lparam);
}cmywnd::cmywnd(qwidget *parent)
: qwidget(parent)
cmywnd::~cmywnd()
void cmywnd::registerkeyhook()
void cmywnd::unregisterkeyhook()
通過上面的方法也可以檢測到鍵盤事件,但是我在開發中遇到乙個問題,就是客戶端程序失去焦點後不能夠檢測到資訊,
注意:在使用鉤子時候,應該盡快的處理訊息,時間太長,將導致鉤子失效,會不在檢測鍵盤事件,這個鉤子失效可能是作業系統為了安全期間,做的超時處理。
乙個qwidget獲得焦點的方式受 focuspolicy 控制
qt::tabfocus
通過tab鍵獲得焦點
qt::clickfocus
通過被單擊獲得焦點
qt::strongfocus
可通過上面兩種方式獲得焦點
qt::nofocus
不能通過上兩種方式獲得焦點(預設值),setfocus仍可使其獲得焦點
留下幾個問題,等下次補充。
1.能不能通過主框架程序檢測鍵盤的訊息,然後通知給子程序?
2.被主框架巢狀的子程序在獲取到焦點後,主框架程序會不會失去焦點?
3.在上面2的條件下,主程序還能不能夠檢測到鍵盤事件了呢?
qt高亮快捷鍵 Qt常用快捷鍵
f1 檢視幫助 f2 跳轉到函式定義 和ctrl 滑鼠左鍵一樣的效果 shift f2 宣告和定義之間切換 f4 標頭檔案和原始檔之間切換 ctrl 1 歡迎模式 ctrl 2 編輯模式 ctrl 3 除錯模式 ctrl 4 專案設定模式 ctrl 5 幫助模式 ctrl 6 輸出模式 alt 0 ...
QT 按鈕控制項設定快捷鍵
keypressevent需要注意的地方 用setshortcut設定快捷鍵 designer 上屬性裡面設定快捷鍵 qt按鈕主要有qtoolbutton 和 qpushbutton,它們很多時候都需要設定快捷鍵,這樣使用者操作起來就更為方便。設定快捷鍵的方式是有幾種的,下面總結了一下,專案中,使用...
QT實現Ctrl S快捷鍵(組合快捷鍵)
首先要清楚,ctrl s的組合快捷鍵中,ctrl是 修飾鍵 s是 按鍵值 平時使用的組合快捷鍵都是要先按下修飾鍵再按按值鍵,順序反了就沒有組合鍵的效果了 qt按鍵按下的事件qkeyevent中有key 和modifier key 函式返回的是發生時間的按鍵值,modifier 返回的而是修飾鍵。因此...