Qt文件閱讀 事件系統

2022-09-11 03:27:07 字數 2564 閱讀 9679

在qt中,事件物件都繼承於qevent類,它表示應用程式內部或由於應用程式需要了解的外部活動而發生的事情。事件可以由qobject子類的任何例項接收和處理,尤其是widget。本文件描述如何在典型應用程式中交付和處理事件。

事件發生時,qt建立事件物件(qevent的適當的子類),呼叫要傳遞到的qobject的例項的event()方法,完成事件的傳遞。

event()方法本身不處理事件;它根據其傳遞的事件型別,呼叫對應的事件處理程式,並給句事件是否被接受或忽略來發出響應。

事件可以來自系統(qmouseevent和qkeyevent);可以是其他**(qtimerevent);可以**於應用本身。

大多數事件型別都有其特定的類,常見的如qresizeevent、qpaintevent、qmouseevent、qkeyevent和qcloseevent。每個類都是qevent的子類,並新增特定於事件的函式。例如,qresizeevent新增了size()和oldsize(),使widgets能夠發現它們的維度是如何更改的。

有些類支援多個實際事件型別。qmouseevent支援按下滑鼠按鈕、雙擊、移動和其他相關操作。

每個事件都有乙個關聯的型別(在qevent::type中定義),作為乙個方便的執行時型別資訊源,可以快速確定給定的事件物件是由哪個子類構造的。

傳遞事件後的通常方法是呼叫虛函式。例如,qpaintevent是通過呼叫qwidget::paintevent()來傳遞的。這個虛函式負責做出適當的反應,通常是通過重新繪製小部件。如果沒有在虛函式的實現中執行所有必要的工作,則可能需要呼叫基類的實現。

例如,下面的**處理自定義核取方塊小部件上的滑鼠左鍵單擊,同時將所有其他按鈕單擊傳遞給基本的qcheckbox類:

void mycheckbox::mousepressevent(qmouseevent *event

) else

}

如果要替換基類的函式,必須自己實現所有內容。但是,如果您只想擴充套件基類的功能,那麼您可以實現您想要的,並呼叫基類來為您不想處理的任何情況獲得預設行為。

有時候,沒有乙個特定於事件的函式,或者特定於事件的函式是不夠的。最常見的例子是按tab鍵。正常情況下,qwidget會擷取這些內容來移動鍵盤焦點。但如果widgets本身需要tab鍵,就需要下面的方法。

可以重新實這些物件的現通用事件處理程式qobject::event(),或者在常規處理之前或之後執行事件處理,或者完全替換函式。乙個非常不尋常的小部件,既需要tab

,又有乙個特定於應用程式的自定義事件,它可能包含以下event()函式:

bool mywidget::event(qevent *event

) }

else

if (event->type() ==mycustomeventtype)

return qwidget::event(event

);}

注意,對於所有未處理的情況,qwidget::event()仍然被呼叫,返回值指示是否處理了事件;true值阻止事件被傳送到其他物件。

有時,乙個物件需要檢視並可能攔截傳遞給另乙個物件的事件。例如,對話方塊通常希望過濾某些小部件的按鍵;例如,修改返回鍵處理。

qobject::installeventfilter()安裝乙個事件過濾器,這個過濾器在目標物件的qobject::eventfilter()中接收事件。事件過濾器在目標物件處理事件之前處理事件,允許它根據需要檢查和丟棄事件。可以使用qobject::removeeventfilter()函式刪除現有的事件過濾器。

當呼叫filter物件的eventfilter()實現時,它可以接受或拒絕事件,並允許或拒絕事件的進一步處理。如果所有事件過濾器都允許對事件進行進一步處理(返回false),則將事件傳送到目標物件本身。如果其中乙個停止處理(返回true),則目標和任何後續的事件過濾器都無法看到該事件。

bool filterobject::eventfilter(qobject *object, qevent *event) 

else

return

false

; }

return

false

;}

上面的**顯示了攔截傳送到特定目標小部件的tab鍵按事件的另一種方法。在本例中,過濾器處理相關事件並返回true,以阻止它們進一步被處理。所有其他事件都被忽略,過濾器返回false,以便通過安裝在其上的任何其他事件過濾器將它們傳送到目標小部件。

sendevent()立即處理事件。當它返回時,事件過濾器和/或物件本身已經處理了事件。對於許多事件類,都有乙個名為isaccepted()的函式,它告訴您上次呼叫的處理程式是否接受或拒絕了該事件。

postevent()將事件發布到佇列中,以便稍後進行分派。下一次qt的主事件迴圈執行時,它會分派所有已發布的事件,並進行一些優化。例如,如果有多個調整大小事件,則將它們壓縮為乙個。同樣的情況也適用於繪製事件:qwidget::update()呼叫postevent(),它通過避免多次重繪來消除閃爍並提高速度。

要建立自定義型別的事件,您需要定義乙個事件編號,該編號必須大於qevent::user,並且您需要繼承qevent的子類,以便傳遞關於自定義事件的特定資訊。有關詳細資訊,請參閱qevent文件。

Qt文件閱讀 事件系統

在qt中,事件物件都繼承於qevent類,它表示應用程式內部或由於應用程式需要了解的外部活動而發生的事情。事件可以由qobject子類的任何例項接收和處理,尤其是widget。本文件描述如何在典型應用程式中交付和處理事件。事件發生時,qt建立事件物件 qevent的適當的子類 呼叫要傳遞到的qobj...

Qt文件閱讀筆記 重現GUI事件進行單元測試

主要的邏輯是,儲存widget事件,然後在test中重放 如下,在私有槽函式中測試函式如果要加模擬,需要在後面新增 data class testgui public qobject 下面的 中,qtest addcolumn為新增列,第乙個為重現的事件,第二個為目標預期值,以及這個qtest ne...

Qt事件系統

在qt中,事件是繼承了虛擬類qevent 的物件,它代表了程式所發生的事情或者程式需要知道的乙個外部活動的結果。事件可以被任意 qobject 子類的例項接收和處理,是與widgets 當發生乙個事件,qt通過構造乙個適當的 qevent 子類的例項來建立事件物件來代表它,並通過呼叫vevent 函...