下面我們來分析一下
qt是如何進行事件監聽的。
首先當然是分析
的原始碼,下面是
::exec()的實現:
可見其直接呼叫了qeventloop
的exec()函式,再來看
qeventloop
::exec(),
qeventloop
::exec()中呼叫了
qeventloop
::enterloop
()方法,而進入
enterloop
()之後才是真正進入了事件監聽迴圈中。
int qeventloop::exec()
再來分析qeventloop
::enterloop
方法,其中使用
while迴圈,不斷呼叫
processevents
處理事件。
int qeventloop::enterloop()
return d->looplevel;
}
下面看qeventloop::processevents
()是如何進行處理的,這裡我們主要分析windows下是如何處理的。下面是
qeventloop::processevents
()的原始碼,可見其呼叫
winpeekmessage
從作業系統的訊息佇列中獲取訊息,呼叫
dispatchmessage
將獲取到的訊息分發給我們的
qt視窗進行處理。可見qt從作業系統獲取到的就已經是封裝過的訊息,使用者操作到訊息的轉換時由作業系統完成的,qt只需要使用
winpeekmessage
從作業系統的訊息佇列中取就可以了。
winpeekmessage
和dispatchmessage
是windows系統程式設計的內容,不在本文討論範圍內,不再深入研究。
bool qeventloop::processevents( processeventsflags flags )
if ( !ok )
} else
#ifdef qt_thread_support
locker.mutex()->lock();
#endif // qt_thread_support
} } else
return false;
} }
bool handled = false;
if ( msg.message == wm_timer ) else if ( msg.message && (!msg.hwnd || !qwidget::find(msg.hwnd)) )
if ( !handled )
if (!ignore) , );
} else if (msg.message == wm_lbuttonup
|| msg.message == wm_mbuttonup
|| msg.message == wm_rbuttonup
|| msg.message == wm_xbuttonup)
}if ( !(flags & excludesocketnotifiers ) )
activatesocketnotifiers();
if ( configrequests ) // any pending configs?
qwinprocessconfigrequests();
return true;
}
上面說到,qt呼叫
dispatchmessage
將從作業系統獲取到的訊息分發給我們的
qt視窗進行處理。
lresult callback qtwndproc( hwnd hwnd, uint message, wparam wparam,
lparam lparam )
bool qetwidget::translatemouseevent( const msg &msg )
}bool consumed = false;
bool handled = false;
if ( receiver->iswidgettype() ) else if ( !widget->isenabled() )
} }
if (!handled)
consumed = receiver->event( e );//最終呼叫event()函式進而呼叫相應的事件處理器
e->spont = false;
return consumed;
}
寫完後發現網上也有一篇做類似分析的文章: Qt事件研究
qt事件的傳遞類似於冒泡,如果在乙個窗體內未設定該事件屬性為true,它會被冒上去,讓該窗體的parent處理,如果仍未被設定為true,它會一直往上冒,直到被處理或到達頂層,設定事件屬性方式,就是呼叫event accept 設定為true,不做處理即為event ignore 設定為false ...
Qt事件研究
qevent void qobject installeventfilter const qobject obj 事件過濾器就是接收所有被傳送到這個物件的事件的物件。這個過濾器可以停止事件或者把它再轉給這個物件。事件過濾器obj通過它的eventfilter 函式來接收事件。如果事件被過濾了 比如,...
qt 事件機制
什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 定製事件型別 到現在為至,我們所說的內容不僅僅適用於ke...