事件(QEvent)

當程式進行到QApplication的exec()方法之後,這時會進入事件迴圈來傾聽應用程式的事件,當使用者按滑鼠、敲鍵盤,或者是窗口需要重新繪製的時候,都會發出一個相應的事件,有些事件在使用者操作時發出,如鍵盤事件等,有些事件則是由系統自動發出,如計時器事件。

一開始學習C語言時,我們的程序都是從進入點(main()函式),一行一行執行直到結束。而實際上的應用程式,通常依據使用者的點擊或輸入,程式會展生不同的響應,舉word來說,當我們點擊開新檔案,程式此時作出回應並新增檔案,不點擊則程式不做回應。這就是所謂的事件驅動,我們程式的執行順序不是線性的,而是由一個個事件驅動著程序繼續執行,沒有事件程式不執行任何代碼,程式持續等待各式事件直到使用者關閉。

Qt的事件跟Signal&Slot機制是不同的,Signal&Slot的機制是同步的,Signal由元件發出,使用connect()函式連接元件上定義的Slot來立即處理。Qt的事件是非同步的,Qt使用一個事件佇列來維護,新的事件產生時基本上會被排到佇列的尾端,前一個事件處理完成,再從佇列的前端取出下一個佇列來處理,必要的時候,Qt的事件也可以是同步的,也可以使用事件過濾器進行過濾處理。

當我們使用Qt預設元件,我們使用的是信號槽,當我們使用自定義元件,我們使用的是事件。假使我們要自定義一個能夠響應滑鼠事件的EventLabel,我們就需要讓EventLabel繼承QLabel,並重載原本的QMouseEvent函式,讓我們的元件能做出希望的操作。

Qt中所有事件類都繼承於QEvent。在事件對象創建完畢後,Qt將這個事件對像傳遞給QObject的event()函數。event()函數並不直接處理事件,而是按照事件對象的類型分派給特定的事件處理函數(event handler),像滑鼠事件的QMouseEvent、鍵盤事件的QKeyEvent、縮放事件的QResizeEvent等。