signal由具體物件發出,然後會馬上交給由connect函式連線的slot進行處理;而對於事件,Qt使用一個事件佇列對所有發出的事件進行維護,當新的事件產生時,會被追加到事件佇列的尾部,前一個事件完成後,取出後面的事件進行處理。但是,必要的時候,Qt的事件也是可以不進入事件佇列,而是直接處理的。並且,事件還可以使用“事件過濾器”進行過濾。總的來說,如果我們使用元件,我們關心的是訊號槽;如果我們自定義元件,我們關心的是事件。因為我們可以透過事件來改變元件的預設操作。比如,如果我們要自定義一個QPushButton,那麼我們就需要重寫它的滑鼠點選事件和鍵盤處理事件,並且在恰當的時候發出clicked()訊號。
還記得我們在main函數里面建立了一個QApplication物件,然後呼叫了它的exec()函式嗎?其實,這個函式就是開始Qt的事件迴圈。在執行exec()函式之後,程式將進入事件迴圈來監聽應用程式的事件。當事件發生時,Qt將建立一個事件物件。Qt的所有事件都繼承於 QEvent類。在事件物件建立完畢後,Qt將這個事件物件傳遞給QObject的event()函式。event()函式並不直接處理事件,而是按照事件物件的型別分派給特定的事件處理函式(event handler)。
在所有元件的父類QWidget中,定義了很多事件處理函式,如keyPressEvent()、
keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等。這些函式都是protected virtual的,也就是說,我們應該在子類中重定義這些函式。
signal由具體物件發出,然後會馬上交給由connect函式連線的slot進行處理;而對於事件,Qt使用一個事件佇列對所有發出的事件進行維護,當新的事件產生時,會被追加到事件佇列的尾部,前一個事件完成後,取出後面的事件進行處理。但是,必要的時候,Qt的事件也是可以不進入事件佇列,而是直接處理的。並且,事件還可以使用“事件過濾器”進行過濾。總的來說,如果我們使用元件,我們關心的是訊號槽;如果我們自定義元件,我們關心的是事件。因為我們可以透過事件來改變元件的預設操作。比如,如果我們要自定義一個QPushButton,那麼我們就需要重寫它的滑鼠點選事件和鍵盤處理事件,並且在恰當的時候發出clicked()訊號。
還記得我們在main函數里面建立了一個QApplication物件,然後呼叫了它的exec()函式嗎?其實,這個函式就是開始Qt的事件迴圈。在執行exec()函式之後,程式將進入事件迴圈來監聽應用程式的事件。當事件發生時,Qt將建立一個事件物件。Qt的所有事件都繼承於 QEvent類。在事件物件建立完畢後,Qt將這個事件物件傳遞給QObject的event()函式。event()函式並不直接處理事件,而是按照事件物件的型別分派給特定的事件處理函式(event handler)。
在所有元件的父類QWidget中,定義了很多事件處理函式,如keyPressEvent()、
keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等。這些函式都是protected virtual的,也就是說,我們應該在子類中重定義這些函式。