在QT中,事件是一個繼承QEvent的對象,。事件通過調(diào)用QObject::event()方法被分發(fā)到繼承自QObject的對象,。事件分發(fā)意味著事件已經(jīng)發(fā)生了,QEvent精確的指出QObject需要作何反應(yīng),。大多數(shù)的事件被指定到QWidge及他的子類,,但是也有很重要的事件不依賴于圖形而發(fā)生,例如,,socket激活,,事件被QSocketNotifier利用進(jìn)行工作。
更一般的,,一個對象需要監(jiān)視另外的事件,。Qt支持它通過QObject::installEventFilter()(和相應(yīng)的去除動作)。例如,,對話框?qū)τ谝恍﹚idget想過濾掉按鍵操作,,舉個例子,改變回車鍵處理,。 事件過濾器開始處理事件在目標(biāo)對象行動之前,。過濾器的QObject::eventFilter()實(shí)現(xiàn)被調(diào)用,能接受或者丟棄過濾,,允許或者拒絕事件的更進(jìn)一步的處理,。如果所有的事件過濾器允許更進(jìn)一步的事件處理,事件將被發(fā)送到目標(biāo)對象本身,。如果他們中的一個停止處理,,目標(biāo)和任何后來的事件過濾器不能看到任何事件。 可以過濾整個應(yīng)用的所有的事件,通過在QApplication中安裝一個事件過濾器,。QToolTip就是通過這種辦法看到鍵盤和鼠標(biāo)的所有活動,。非常強(qiáng)大,但是這也降低了在整個應(yīng)用中每個單一事件的分發(fā)速度,,所以還是最好避免,。 指定對象的過濾器被調(diào)用之前全局事件過濾器會被首先調(diào)用。 最后,,許多應(yīng)用想要生成和發(fā)送他們自己的事件,。 生成一個內(nèi)建類型的事件是非常簡單的:生成相應(yīng)類型的一個對象,然后調(diào)用QApplication::sendEvent()或者QApplication::postEvent(),。 sendEvent()立刻處理事件--當(dāng)sendEvent()返回的時候,,(事件過濾器和)對象已經(jīng)處理完了事件。對于許多的事件類有一個函數(shù)叫做isAccepted()將被調(diào)用告訴你是否事件已經(jīng)被接受或被最后一個處理者丟棄 postEvent()投送事件到一個隊(duì)列以備之后分發(fā),。下一次Qt的主事件循環(huán)運(yùn)行的時候,,分發(fā)所有的已經(jīng)投送的事件,附帶一些優(yōu)化,,比如,,如果有幾次resize事件將被緊縮成一個。對于相同的應(yīng)用paint事件:QWidget::update()調(diào)用postEvent(),通過避免多次repaint減少閃爍加快速度,。 postEvent()也經(jīng)常用在對象初始化,,因此已經(jīng)投送的事件將不久被分發(fā)在對象初始化完成之后。 對于生成自定義類型的事件,,你需要定義一個事件號,,它必須要大于QEvent::User,為了傳遞你自定義事件的特征你可能需要子類QCustomEvent 詳細(xì)的請看QCustomEvent的文檔
原文出處: |
|