QT如何捕獲全域性的鍵盤事件?

2021-06-28 10:30:45 字數 3171 閱讀 5076

qt

如何捕獲全域性的鍵盤事件

方法一:

繼承類,

並過載notify()

函式qt

是用函式來分發事件的

。想要在任何事件過濾器檢視任何事件之前先得到這些事件

,過載這個函式是唯一的辦法

。通常來說事件過濾器更好用一些

,因為不需要去繼承類。

而且可以給

物件安裝任意個數的事件過濾器

,相比之下

,notify()

函式只有乙個

。**如下: ;}}

注:

qt

的事件和

qt中的

signal

不一樣. 

後者通常用來"使用

"widget, 

而前者用來"實現

" widget. 

比如乙個按鈕

, 我們使用這個按鈕的時候

, 我們只關心他

clicked()

的signal, 

至於這個按鈕如何接收處理滑鼠事件

,再發射這個訊號

,我們是不用關心的

. 但是如果我們要過載乙個按鈕的時候

,我們就要面對

event了. 

比如我們可以改變它的行為

,在滑鼠按鍵按下的時候

(mouse press event) 

就觸發clicked()

的signal

而不是通常在釋放的

( mouse release event)時候.

事件的產生

事件的兩種**:

一種是系統產生的

;通常是

window system

把從系統得到的訊息

,比如滑鼠按鍵

,鍵盤按鍵等

, 放入系統的訊息佇列中

. qt

事件迴圈的時候讀取這些事件

,轉化為

qevent,

再依次處理.

一種是由

qt應用程式程式自身產生的

.程式產生事件有兩種方式

, 一種是呼叫

例如qwidget::update()函式,

當需要重新繪製螢幕時

,程式呼叫

update()

函式,new

出來乙個

paintevent,

呼叫將其放入

qt的訊息佇列中

,等待依次被處理

.另一種方式是呼叫

sendevent()

函式. 

這時候事件不會放入佇列

, 而是直接被派發和處理

, qwidget::repaint()

函式用的就是這種方式.

事件的派發和處理

首先說明

qt中事件過濾器的概念

. 事件過濾器是

qt中乙個獨特的事件處理機制

, 功能強大而且使用起來靈活方便

. 通過它

, 可以讓乙個物件偵聽攔截另外乙個物件的事件

. 事件過濾器是這樣實現的

: 在所有

qt物件的基類

: qobject

中有乙個型別為

qobjectlist

的成員變數

,名字為

eventfilters,

當某個qobjec (qobja)

給另乙個

qobject (qobjb)

安裝了事件過濾器之後

, qobjb

會把qobja

的指標儲存在

eventfilters中.

在qobjb

處理事件之前

,會先去檢查

eventfilters

列表, 

如果非空

, 就先呼叫列表中物件的

eventfilter()函式.

乙個物件可以給多個物件安裝過濾器

. 同樣

, 乙個物件能同時被安裝多個過濾器

, 在事件到達之後

, 這些過濾器以安裝次序的反序被呼叫

. 事件過濾器函式

( eventfilter() ) 

返回值是

bool型, 

如果返回

true, 

則表示該事件已經被處理完畢

, qt

將直接返回

, 進行下一事件的處理

; 如果返回

false, 

事件將接著被送往剩下的事件過濾器或是目標物件進行處理.

qt中,事件的派發是從

開始的, 

因為也是繼承自

qobject, 

所以先檢查

物件, 

如果有事件過濾器安裝在上, 

先呼叫這些事件過濾器

. 接下來

會過濾或合併一些事件

(比如失效

widget

的滑鼠事件會被過濾掉

, 而同一區域重複的繪圖事件會被合併

). 之後

,事件被送到

reciver::event() 處理.

同樣, 在

reciver::event()中, 

先檢查有無事件過濾器安裝在

reciever上. 

若有, 

則呼叫之

. 接下來,根據

qevent

的型別, 

呼叫相應的特定事件處理函式

. 一些常見的事件都有特定事件處理函式

, 比如

:mousepressevent(), focusoutevent(),  resizeevent(),paintevent(), resizeevent()

等等. 

在實際應用中

,經常需要過載這些特定事件處理函式在處理事件

. 但對於那些不常見的事件

, 是沒有相對應的特定事件處理函式的

. 如果要處理這些事件

, 就需要使用別的辦法

, 比如過載

event() 

函式, 

或是安裝事件過濾器.

QT 之鍵盤事件(捕獲鍵盤按下 鬆開事件)

我們在做軟體時候,經常會碰到這樣的場景,比如按下f5進行重新整理功能,按下f1進行幫助之類的快捷鍵方式。那麼在qt中該怎樣做呢?查閱文件,qt已經實現了這一系列的鍵盤事件 void qwidget keypressevent qkeyevent event 鍵盤按下事件 void qwidget k...

Qt之鍵盤事件 捕獲組合鍵

今天在做快捷鍵需求時,發現了乙個問題,qt的鍵盤事件不能捕獲多個按鍵按下.即便是在使用modifiers 時,也只能獲得類似於shfit x,ctrl c,alt y等等之類的快捷鍵,對於shift x c諸如此類更多的組合就無能為力的.於是各種網上查詢資料即查閱文件得知,qt的鍵盤事件機制一次每次...

QT鍵盤事件

有按下後鬆開事件 virtual void keypressevent qkeyevent event 鍵盤按下事件 virtual void keyreleaseevent qkeyevent event 鍵盤鬆開事件加個頭檔案 include在一些程式中,我們發現這樣並不好使,怎麼回事呢?這時候...