1. 程式人生 > >煙臺 嵌入式產品開發

煙臺 嵌入式產品開發

最近在想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這種巨集大的事件程式設計機制,很多東東需要猜測的。