久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Qt事件和事件過濾器

 t涂鴉 2012-02-21

在QT中,事件是一個繼承QEvent的對象,。事件通過調(diào)用QObject::event()方法被分發(fā)到繼承自QObject的對象,。事件分發(fā)意味著事件已經(jīng)發(fā)生了,QEvent精確的指出QObject需要作何反應(yīng),。大多數(shù)的事件被指定到QWidge及他的子類,,但是也有很重要的事件不依賴于圖形而發(fā)生,例如,,socket激活,,事件被QSocketNotifier利用進(jìn)行工作。

一些事件來自視窗系統(tǒng),,例如:QMouseEvent,,一些來自其他源,例如:QTimerEvent,還有一些來自于應(yīng)用程序,。通常Qt是對稱的,,所以你可以發(fā)送事件用相同的方法向QT自己的事件循環(huán)那樣。

大多數(shù)的事件類型有指定的類,,最常用的,,QResizeEvent,QPaintEvent,QMouseEvent,QKeyEvent和QCloseEvent.也有其他的,大約有四十個左右,但是都很少用到。

每一個類子類QEvent并且增加指定事件的函數(shù),;注意啦,,例如,QResizeEvent,。在QResizeEvent的情況下,,QResizeEvent:size()和QResizeEvent:oldSize()被添加。

一些類支持超過一種事件類型,。QMouseEvent支持鼠標(biāo)move,presses,shift-presses,drags,clicks,right-presses等等

因?yàn)槌绦蛐枰磻?yīng)于多變的和復(fù)雜的方式,,Qt的事件分發(fā)技術(shù)是靈活的。QApplication::notify()的文檔簡明的描述了這整個過程,,這里我們將充分的解釋99%的應(yīng)用,。

一個事件被分發(fā)的通常的方法是通過調(diào)用一個虛函數(shù)。例如,QPaintEvent通過調(diào)用QWidget::paintEvent()被分發(fā),。這個虛函數(shù)負(fù)責(zé)正確的響應(yīng),,重新繪畫這個widget.

有時候不存在那樣的一個特定的事件函數(shù),或者特定的那個函數(shù)不能充分的滿足需求,。最通常的例子是tab鍵的press動作,,它通常被QWidget認(rèn)為是移動鍵盤的焦點(diǎn),但是一些widgets本身需要TAB鍵,。

這些對象能重新實(shí)現(xiàn)QObject::event(),,通常的事件處理方法,在通常的處理事件的前后做他們的事件處理,,或者完全代替它。一個非常不尋常的widget既解釋tab又有一個指定應(yīng)用的自定義事件可能包含:

 

  1. bool MyClass:event( QEvent * e ) {   
  2. if ( e->type() == QEvent::KeyPress ) {   
  3. QKeyEvent * ke = (QKeyEvent*) e;   
  4. if ( ke->key() == Key_Tab ) {   
  5. // special tab handling here   
  6. k->accept();   
  7. return TRUE;   
  8. }   
  9. else if ( e->type() >= QEvent::User ) {   
  10. QCustomEvent * c = (QCustomEvent*) e;   
  11. // custom event handling here   
  12. return TRUE;   
  13. }   
  14. QWidget::event( e );   
  15. }   


更一般的,,一個對象需要監(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的文檔 

 

原文出處:

http://www./pc/pccon.php?id=10001922&nid=321320

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多