煙臺 嵌入式產品開發
最近在想Qt事件產生後,放入到系統的事件佇列中,等待事件分發器向外分發,
但是Qt是如何得知該事件要分發給誰呢?
下面是網友的一些回答:
一個事件發生之後,Qt怎麼知道該發給哪個QObject的event()函式呢?
我看了一下文件裡關於QApplication::sendEvent()函式的說明,
一個sendEvent()函式只能連線一對event-receiver。
所以Qt是會自動把事件傳送給所有的QObject(包括自定義的)嗎?
個人認為會進行廣播,也就是傳送給所有 QObject,
只不過有的物件會進行處理,有的物件直接忽略。
至於 sendEvent() 函式,你當然可以通過兩次呼叫來發送給兩個物件的
thx,感謝豆子君的回覆~btw,
說得更細點可能是QCoreApplication類先發送給每個Object樹的頂層?
(因為子元件ignore後會自動傳送給父元件)
感覺應該是可以這樣理解的
keypress event應該是發給當前焦點的object,
如果不處理為false,再由object向父object傳遞,處理就為true 停止傳遞。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
因為Qt所有的物件都繼承自QObject,那麼是不是在這個QObject中關聯了事件需要發到哪個訊息佇列上呢?
還是定義成全域性的或者是靜態的啦?一個程序有一個系統訊息佇列。
物件在建立的時候,是不是都被添加了一個樹狀的結構中,
這樣分發訊息的時候,Dispatcher從這個樹的頂部開始依次向下呼叫每個QObject物件的event()函式。
先向父親為0的物件進行分發,物件在收發後,同時分發給他的孩子,(即依次呼叫所有孩子的event()函式)。
因為GUI是單程序單執行緒的,所以這樣的遍歷呼叫是同步阻塞式的,只要其中有一個返回true,
則表示該事件被處理了,Dispatcher就無需再分發了,可以直接從訊息佇列中刪除了。
以後只是俺個人的理解,因為沒有做過GUI這種巨集大的事件程式設計機制,很多東東需要猜測的。