2011-08-14 02:05
1529人閱讀收藏
qtevents
function
system
qt是事件驅動的, 程式每個動作都是由某個事件所觸發。 qt事件的型別很多,我們可以通過檢視qt的 manual中的event system 和 qevent 來獲得各個事件的詳細資訊。
posted events
sent events
比如考慮重繪事件處理函式 paintevent(),3種事件都能使得該函式被呼叫:
while (!exit_was_called)while (!spontaneous_event_queue_is_empty)
while (!posted_event_queue_is_empty)
}
例子(傳送x按鍵事件到mainwin):
qkeyevent event(qevent::keypress, key_x, 'x', 0);所有的事件都最終通過 notify 派發到相應的物件中。
看看notify()呼叫的內部函式notify_helper()的原始碼部分:
如果未被過濾,再通過 receiver 安裝的過濾器
如果仍未被過濾,才呼叫 receiver->event() 函式進行派發
/*!\internal
helper function called by notify()
*/
monitoredobj->installeventfilter(filterobj);
bool qobject::eventfilter ( qobject * watched, qevent * event )
對於某些類別的事件, 如果在整個事件的派發過程結束後還沒有被處理, 那麼這個事件將會向上**給它的父widget, 直到最頂層視窗.
如何判斷乙個事件是否被處理了呢? (有兩個層次)
另一種是呼叫qevent::ignore() 或 qevent::accept() 對事件進行標識,accept表示事件被處理
case qevent::tooltip:case qevent::whatsthis:
case qevent::querywhatsthis:
help->setaccepted(eventaccepted);
}break;
這兒顯示了對 whatsthis 事件的處理:先派發給 w,如果事件被accepted 或已經是頂級視窗,則停止;否則獲取w的父物件,繼續派發。
qobject與qwidget提供了許多特定的事件handlers,分別對應於不同的事件型別。(如paintevent()對應paint事件)
event()函式是所有物件事件的入口,qobject和qwidget中預設的實現是簡單地把事件推入特定的事件handlers。
事件過濾器是乙個物件,它接收別的物件的事件,在這些事件到達指定目標之間。
qt4.6的事件列表:
qdynamicpropertychangeevent
qfileopenevent
qfocusevent
qgestureevent
qgraphicssceneevent
qhelpevent
qhideevent
qhoverevent
qicondragevent
qinputevent
qinputmethodevent
qmoveevent
qpaintevent
qresizeevent
qshortcutevent
qshowevent
qstatustipevent
qtimerevent
qwhatsthisclickedevent
qwindowstatechangeevent
Qt事件系統
在qt中,事件是繼承了虛擬類qevent 的物件,它代表了程式所發生的事情或者程式需要知道的乙個外部活動的結果。事件可以被任意 qobject 子類的例項接收和處理,是與widgets 當發生乙個事件,qt通過構造乙個適當的 qevent 子類的例項來建立事件物件來代表它,並通過呼叫vevent 函...
Qt之事件系統
乙個事件有兩個資訊 誰的事件和什麼事件。在不使用事件過濾器的情況下,應用程式會直接將事件傳送給對應的控制項物件,由對應的控制項物件自己去處理,但是如果使用了事件過濾器,應用程式會將控制項的事件首先發給事件過濾器,但這前提是那個控制項安裝了事件過濾器,這樣應用程式才知道它需要被監控,才會把它的事件先傳...
Qt 的事件系統
在 qt 裡面,事件就是繼承自抽象 qevent 類的乙個物件,它表示乙個應用內部或者乙個應用需要知道的外部活動的結果。任何乙個繼承自 qobject 的子類例項都可以接收和處理事件。乙個事件發生,qt 會建立乙個能夠合適的描述這個事件的物件,這個物件繼承自 qevent.然後通過呼叫 event ...