qt事件學習

QT中事件的概念:

           事件是系統或qt本身在不同時刻發出的。如點擊鼠標,按下鍵盤,窗口重繪。一些事件是在對用戶操作做出響應時發出,如鍵盤事件。另一些事件是系統自動發出,如計時器事件

 

QT中事件和信號槽的區別:

     signal是由具體對象發出,然後會馬上交給connect連接的slot進行處理,而對於事件,qt使用一個事件隊列對所發生的事件進行維護,新事件會加到隊列的尾部。但是必要的時候,事件也可以不進入隊列而直接處理,並且事件還可以使用事件過濾器來進行過濾。總的來說,我們使用組件,關注的是信號槽,使用自定義組件,我們關心的是事件,可以通過事件來改變組件的默認操作。如我們要自定義一個QPushButton,就需要重寫其鼠標點擊事件和鍵盤處理事件,並在恰當的時候發出clicked()信號

 

查看幫助文檔QEvent,

   QT的事件循環過程:QT main event loop 從 event queue 中獲得窗口系統事件,把它們翻譯成QEvents,然後把這些translated events 發給QObjects。一般而言,事件來自基本窗口事件,但也可以通過QCoreApplication::sendEvent()或QCoreApplication::postEvent()手動發送事件。

   QObjects是通過QObject::Event()函數來接受事件的。這個函數可以被子類執行來自定義事件處理和添加另外的事件類型。如QWidget::Event()。默認情況下,事件被分派到事件處理,如QObject::TimerEvent(),QWidget::MouseMoveEvent().QObject::installEventFilter()允許對象來攔截到另一個對象的事件

   基本的QEvents只包含一種事件類型參數和一個“accept”標誌,accept標誌可以通過accept()來設置,ignore()來清除。如果它被設置爲默認情況,子類可以選擇在constructor中來清除它,而不用ignore()

  子類的QEvent包含額外的參數來描述特殊的事件。

  

   這裏涉及到了QApplication的exec()函數,查看幫助文檔,可以明白其功能:進入主事件循環,等待exit()調用(exit()的函數:

void QCoreApplication::exit ( int returnCode = 0 )   [static],用一個return code告訴應用程序退出。具體看幫助文檔。)。QApplication的瞭解:包含主事件循環(所有來自窗口系統的事件和其它源的存儲和分發),應用程序的初始化和最終化,任務管理。使用Qt的任何Gui application,只有一個QApplication對象,對於非Qt Gui application,使用QCoreApplication代替,因爲它不使用QtGui

Library。

 

 QT學習之路21:

 

           QKeyEvent *keyEvent = static_cast<QKeyEvent *>(Event)

這裏涉及一個static_cast的用法:

 

用法:static_cast < type-id > ( expression )

  該運算符把expression轉換爲type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:

  ①用於類層次結構中基類(父類)和派生類(子類)之間指針或引用的轉換

  進行上行轉換(把派生類的指針或引用轉換成基類表示)是安全的;

  進行下行轉換(把基類指針或引用轉換成派生類表示)時,由於沒有動態類型檢查,所以是不安全的。

  ②用於基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

  ③把空指針轉換成目標類型的空指針。

  ④把任何類型的表達式轉換成void類型。

  注意:static_cast不能轉換掉expression的const、volitale、或者__unaligned屬性。

  C++中static_cast和reinterpret_cast的區別

  C++primer第五章裏寫了編譯器隱式執行任何類型轉換都可由static_cast顯示完成;reinterpret_cast通常爲操作數的位模式提供較低層的重新解釋

 

 

     event()的返回值主要是通知QApplication的nogify()函數是否處理下一事件,而accept()或ignore()用於不同事件處理器之間的溝通,如判斷某一事件是否處理

     關於事件過濾器,QObject::eventFilter(QObject *watched,QEvent *event)

在使用之前,應調用QObject::installEventFilter(QObject *filterObj)

     安裝了多個過濾器的組件,最後安裝的一個事件過濾器會最先調用,類似堆棧行爲。

 

     如果在事件過濾器中delete了接受組件,務必將其設置爲true.否則QT還會把事件分發給這個接受組件,導致程序崩潰。

    事件的調用最終都會QCoreApplication的notify()函數,最大的控制權實際上是重寫QCoreApplication的notify()函數。由此可以看出,qt的事件處理實際上可以分成5個層次:重定義事件處理函數,重定義event(),爲單個組件安裝事件過濾器,爲QApplication安裝事件過濾器,重定義QCoreApplication的notify()函數

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章