Qt事件機制研究

2021-09-11 05:04:51 字數 2387 閱讀 1286

下面我們來分析一下

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...