Qt事件系統

2021-06-15 10:09:28 字數 3277 閱讀 5226

在qt中,事件是繼承了虛擬類qevent

的物件,它代表了程式所發生的事情或者程式需要知道的乙個外部活動的結果。事件可以被任意

qobject

子類的例項接收和處理,是與widgets

當發生乙個事件,qt通過構造乙個適當的 qevent

子類的例項來建立事件物件來代表它,並通過呼叫vevent()函式把它傳送到特定的 qobject

例項。該函式本身不處理事件:根據傳送的事件型別,它為特定的時間型別呼叫乙個事件處理程式,並根據事件是被接受或忽略傳送乙個響應。

一些事件,如qmouseevent

和 qkeyevent

來自windows系統。如qtimerevent

, 來自其他**,一些來自程式本身。

大多數的事件型別有特別的類,尤其是 qresizeevent

, qpaintevent

, qmouseevent

, qkeyevent

,andqcloseevent

. ,它們都繼承了qevent

和新增了特殊的函式。如 qresizeevent

新增了 size()

和 oldsize()

函式使得widgets 可以獲得其改變的規模。

一些類支援多於一種實際的事件型別。 qmouseevent

支援滑鼠按下,雙擊,移動和其他相關操作。

每個事件都有乙個定義在qevent::type

的相關的型別,它可以用作執行時的型別資訊以快速確定事件物件是構造自哪個子類。

()文件對稱進行了確切的描述。

通常事件被傳送的方法是呼叫乙個虛函式。例如, qpaintevent

通過呼叫 qwidget::paintevent

().而被傳送。該虛函式複雜作出適當的響應,通常是重繪widget。如果在你實現的虛函式裡不能完成所需要的功能,可以呼叫基類的實現。

例如,下面的**處理了自定義的checkbox 滑鼠左鍵按下事件,把其他按鍵按下的事件傳送給基類qcheckbox

voidmycheckbox

::mousepressevent(

qmouseevent

*event)

else

}

如果你想取代基類的函式,你必須自己實現每件事。然而,如果你只想擴充套件基類的功能,你可以實現自己想實現的部分,在任何你不想處理情況,可以呼叫基類來獲得預設的處理。

偶爾,可能沒有特定事件的函式,或者特定事件的函式功能不充分。最常見的例子包含tab 按下。通常, qwidget

攔截事件來移動鍵盤焦點,但是有的widget需要自己處理tab 按下事件。

這些物件可以重新實現 qobject::event

(),,一般的事件處理程式,可以在通常的事件處理之前或之後對它們的事件進行處理,或者完全取代整個函式的。乙個既攔截tab 也有自定義事件的widget 可能包含以下的event()

函式:

boolmywidget

::event(

qevent

*event)

} 

else

if(event

->

type()

==mycustomeventtype)

return

qwidget

::event(event);

}

我們注意到對於沒有處理的所有情況都呼叫了qwidget::event

() ,而且返回值表明了事件是否被處理。返回值true阻止了事件被傳遞給其他物件。

有時乙個物件需要檢查並可能攔截被傳送給其他物件的事件。例如,對話方塊一般需要為一下widget過濾鍵盤按鍵事件。例如,修改返回鍵處理。

qobject::installeventfilter

()設定了eventfilter,,在目標物件的qobject::eventfilter

() 函式裡接收事件。事件過濾器在目標物件之前處理事件,根據需要允許對事件進行檢查和丟棄。可以用 qobject::removeeventfilter

()函式移除乙個已經存在的事件過濾器。

當乙個過濾器物件的eventfilter()

實現被呼叫,它可以接受或不接受事件,允許或拒絕更進一步的處理事件。如果所有的事件過濾器允許更進一步的處理事件,事件將被傳送給目標物件本身。如果其中某個事件停止處理,目標物件和後面一些事件過濾器都接收不到該事件。

boolfilterobject

::eventfilter(

qobject

*object

,qevent

*event)

else

return

false

;

}

return

false

;

}

以上**演示了另一種攔截tab按鍵事件併發送到特定目標widget的方法。在這種情況下,事件過濾器處理了相關的事件並返回true阻止事件被進一步處理。其他的事件則被忽略,事件過濾器返回false以允許它們被傳送到目標widget,通過任何已經安裝的事件過濾器。

安裝事件過濾器。這樣的全域性事件過濾器將會在特定物件的過濾器之前被呼叫。這很強大,但是也會使得整個程式的事件傳送變慢。

().傳送事件。

立即處理事件。當它返回,事件過濾器和物件本身已經處理了事件。對於很多事件型別,有乙個isaccepted()函式用來獲取最近的處理過程事件是被接受還是不被接受。

把事件傳遞到佇列等待分發。下一次主事件迴圈執行,它進行一些優化將分發所有的佇列中的事件。例如,有一些resize 事件,將被壓縮成乙個事件。同樣的應用與paint事件:qwidget::update

,它消除閃爍和增加速度以避免多次重繪。

在物件初始化過程中也被用到,因為發出的事件將在物件的初始化完成之後立即分發。當實現乙個widget,意識到事件可能在其生命期的早期被分發這很重要,在其建構函式中,確保在早期初始化成員變數,在其有機會接收到事件之前。

要建立自定義的事件型別,需要定義乙個事件號,必須大於 qevent::user

.

Qt 事件系統

2011 08 14 02 05 1529人閱讀收藏 qtevents function system qt是事件驅動的,程式每個動作都是由某個事件所觸發。qt事件的型別很多,我們可以通過檢視qt的 manual中的event system 和 qevent 來獲得各個事件的詳細資訊。posted ...

Qt之事件系統

乙個事件有兩個資訊 誰的事件和什麼事件。在不使用事件過濾器的情況下,應用程式會直接將事件傳送給對應的控制項物件,由對應的控制項物件自己去處理,但是如果使用了事件過濾器,應用程式會將控制項的事件首先發給事件過濾器,但這前提是那個控制項安裝了事件過濾器,這樣應用程式才知道它需要被監控,才會把它的事件先傳...

Qt 的事件系統

在 qt 裡面,事件就是繼承自抽象 qevent 類的乙個物件,它表示乙個應用內部或者乙個應用需要知道的外部活動的結果。任何乙個繼承自 qobject 的子類例項都可以接收和處理事件。乙個事件發生,qt 會建立乙個能夠合適的描述這個事件的物件,這個物件繼承自 qevent.然後通過呼叫 event ...