qt事件機制

2021-06-20 21:06:20 字數 1552 閱讀 3395

學習了一段時間的qt之後,發現qt的事件機制和其他語言的機制有些不同。qt除了能夠通過訊號和槽機制來實現一些action動作之外,還可以用物件所帶的事件,或者使用者自定義的事件來實現物件的一些行為處理。

現在,我們從頭開始講解。

到底什麼是事件呢? 

事件起源: 基於事件如何被產生與分發,可以把事件分為以下三類。

spontaneous 事件——自發事件

由視窗系統產生,它們被放到系統佇列中,通過事件迴圈逐個處理。

posted 事件

由qt或是應用程式產生,它們被qt組成佇列,再通過事件迴圈處理。

sent 事件

由qt或是應用程式產生,但它們被直接傳送到目標物件。

qt事件迴圈的過程

首 先,事件迴圈處理所有的posted事件,直到佇列空。 

然後再處理所有的spontaneous事件,最後它處理所有的因為處理spontaneous事 件而產生的posted事件。 

send 事件並不在事件迴圈內處理,它們都直接被傳送到了目標物件。 

現在看一下實踐中的paint 事件是如何工作的。 

當乙個widget第一次可見,或是被遮擋後再次變為可見, 

視窗系統產生乙個(spontaneous) paint事件,要求程式重畫widget,事件迴圈最終從事件佇列中撿選這個事件並把它分發到那個需要重畫的widget。 

並不是所有的paint事件都是由視窗系統產生的。當你呼叫qwidget::update()去強行重畫widget,這個widget會post 乙個paint 事件給自己。這個paint事件被放入佇列,最終被事件迴圈分發之。

假 如你很不耐煩,等不及事件迴圈去重畫乙個widget, 理論上,你應該直接呼叫paintevent()強制進行立即的重畫。但實際上這不總是可行的,因為paintevent()函式是protected的 (很可能訪問不了)。它也繞開了任何存在的事件過濾器。因為這些原因,qt提供了乙個機制,直接sending事件而不是posting 。 

qwidget::repaint()就使用了這個機制來強制進行立即重畫。

人工合成的事件

一是posting 事件

二是sending 事件

定製事件型別

事件處理與過濾

qt中的事件可以在五個不同的層次上被處理

1.重新實現乙個特定的事件handler

qobject與qwidget提供了許多特定的事件handlers,分別對應於不同的事件型別。(如paintevent()對應paint事件)

2.重新實現qobject::event()

event()函式是所有物件事件的入口,qobject和qwidget中預設的實現是簡單地把事件推入特定的事件handlers。

3.在qobject安裝上事件過濾器

事件過濾器是乙個物件,它接收別的物件的事件,在這些事件到達指定目標之間。

它會監視程式中傳送到所有物件的所有事件。

qt的事件迴圈與sendevent()呼叫這個函式來分發事件,通過重寫它,你可以在別人之前看到事件。

特定物件的事件處理

通過accept( )函式和ignore( )函式。

qt 事件機制

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 定製事件型別 到現在為至,我們所說的內容不僅僅適用於ke...

QT事件機制

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 到現在為至,我們所說的內容不僅僅適用於key事件,也適用...

qt事件機制

coffeegg qt事件機制 學習了一段時間的qt之後,發現qt的事件機制和其他語言的機制有些不同。qt除了能夠 通過訊號和槽機制來實現一些action動作之外,還可以用物件所帶的事件,或者使用者自 定義的事件來實現物件的一些行為處理。現在,我們從頭開始講解。到底什麼是事件呢?事件起源 基於事件如...