精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

QT類 Qevent事件處理過程 事件過濾器

移動開發
本文介紹的是QT類 Qevent事件處理過程 事件過濾器,事件的操作應該友們很感興趣,先來看你本文介紹。

QT類 Qevent事件處理過程 事件過濾器 是本文要介紹的內容,我們直接進入內容。

事件處理流程:

某個事件發生------>exec()循環會接收到這個事件------>

創建一個事件對象,并將對象傳遞給QObject::event()------>

在QWidget::event()函數中,分配給特定的事件處理函數------>

在QButton的事件處理函數中emit(clicked消息)

前面說到了事件的作用,下面來看看我們如何來接收事件。回憶一下前面的代碼,我們在子類中重寫了事件函數,以便讓這些子類按照我們的需要完成某些功能,就像下面的代碼:

  1. void MyLabel::mousePressEvent(QMouseEvent * event)  
  2. {  
  3.         if(event->button() == Qt::LeftButton) {  
  4.                 // do something  
  5.         } else {  
  6.                 QLabel::mousePressEvent(event);  
  7.         }  

上面的代碼和前面類似,在鼠標按下的事件中檢測,如果按下的是左鍵,做我們的處理工作,如果不是左鍵,則調用父類的函數。這在某種程度上說,是把事件向上傳遞給父類去響應,也就是說,我們在子類中“忽略”了這個事件。

我們可以把Qt的事件傳遞看成鏈狀:如果子類沒有處理這個事件,就會繼續向其他類傳遞。其實,Qt的事件對象都有一個accept()函數和ignore()函數。正如它們的名字,前者用來告訴Qt,事件處理函數“接收”了這個事件,不要再傳遞;后者則告訴Qt,事件處理函數“忽略”了這個事件,需要繼續傳遞,尋找另外的接受者。在事件處理函數中,可以使用isAccepted()來查詢這個事件是不是已經被接收了。

事實上,我們很少使用accept()和ignore()函數,而是想上面的示例一樣,如果希望忽略事件,只要調用父類的響應函數即可。記得我們曾經說過,Qt中的事件大部分是protected的,因此,重寫的函數必定存在著其父類中的響應函數,這個方法是可行的。為什么要這么做呢?因為我們無法確認父類中的這個處理函數沒有操作,如果我們在子類中直接忽略事件,Qt不會再去尋找其他的接受者,那么父類的操作也就不能進行,這可能會有潛在的危險。另外我們查看一下QWidget的mousePressEvent()函數的實現:

  1. void QWidget::mousePressEvent(QMouseEvent *event)  
  2. {  
  3.         event->ignore();  
  4.         if ((windowType() == Qt::Popup)) {  
  5.                 event->accept();  
  6.                 QWidget* w;  
  7.                 while ((w = qApp->activePopupWidget()) && w != this){  
  8.                         w->close();  
  9.                         if (qApp->activePopupWidget() == w) // widget does not want to dissappear  
  10.                                 w->hide(); // hide at least  
  11.                 }  
  12.                 if (!rect().contains(event->pos())){  
  13.                         close();  
  14.                 }  
  15.         }  
  16. }  

請注意第一條語句,如果所有子類都沒有覆蓋mousePressEvent函數,這個事件會在這里被忽略掉,這暗示著這個組件不關心這個事件,這個事件就可能被傳遞給其父組件。

不過,事情也不是絕對的。在一個情形下,我們必須使用accept()和ignore()函數,那就是在窗口關閉的時候。如果你在窗口關閉時需要有個詢問對話框,那么就需要這么去寫:

  1. void MainWindow::closeEvent(QCloseEvent * event)  
  2. {  
  3.         if(continueToClose()) {  
  4.                 event->accept();  
  5.         } else {  
  6.                 event->ignore();  
  7.         }  
  8. }  
  9. bool MainWindow::continueToClose()  
  10. {  
  11.         if(QMessageBox::question(this,  
  12.                                             tr("Quit"),  
  13.                                             tr("Are you sure to quit this application?"),  
  14.                                             QMessageBox::Yes | QMessageBox::No,  
  15.                                             QMessageBox::No)  
  16.                 == QMessageBox::Yes) {  
  17.                 return true;  
  18.         } else {  
  19.                 return false;  
  20.         }  

這樣,我們經過詢問之后才能正常退出程序

今天要說的是event()函數。記得之前曾經提到過這個函數,說在事件對象創建完畢后,Qt將這個事件對象傳遞給QObject的event()函數。event()函數并不直接處理事件,而是將這些事件對象按照它們不同的類型,分發給不同的事件處理器(event handler)。

event()函數主要用于事件的分發,所以,如果你希望在事件分發之前做一些操作,那么,就需要注意這個event()函數了。為了達到這種目的,我們可以重寫event()函數。例如,如果你希望在窗口中的tab鍵按下時將焦點移動到下一組件,而不是讓具有焦點的組件處理,那么你就可以繼承QWidget,并重寫它的event()函數,已達到這個目的:

  1. bool MyWidget::event(QEvent *event) {  
  2.         if (event->type() == QEvent::KeyPress) {  
  3.                 QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);  
  4.                 if (keyEvent->key() == Qt::Key_Tab) {  
  5.                         // 處理Tab鍵  
  6.                         return true;  
  7.                 }  
  8.         }  
  9.  
  10.         return QWidget::event(event);  

event()函數接受一個QEvent對象,也就是需要這個函數進行轉發的對象。為了進行轉發,必定需要有一系列的類型判斷,這就可以調用QEvent的type()函數,其返回值是QEvent::Type類型的枚舉。我們處理過自己需要的事件后,可以直接return回去,對于其他我們不關心的事件,需要調用父類的event()函數繼續轉發,否則這個組件就只能處理我們定義的事件了。

event()函數返回值是bool類型,如果傳入的事件已被識別并且處理,返回true,否則返回false。如果返回值是true,QApplication會認為這個事件已經處理完畢,會繼續處理事件隊列中的下一事件;如果返回值是false,QApplication會嘗試尋找這個事件的下一個處理函數。

event()函數的返回值和事件的accept()和ignore()函數不同。accept()和ignore()函數用于不同的事件處理器之間的溝通,例如判斷這一事件是否處理;event()函數的返回值主要是通知QApplication的notify()函數是否處理下一事件。為了更加明晰這一點,我們來看看QWidget的event()函數是如何定義的:

  1. bool QWidget::event(QEvent *event) {  
  2.         switch (e->type()) {  
  3.         case QEvent::KeyPress:  
  4.                  keyPressEvent((QKeyEvent *)event);  
  5.                 if (!((QKeyEvent *)event)->isAccepted())  
  6.                         return false;  
  7.                 break;  
  8.         case QEvent::KeyRelease:  
  9.                 keyReleaseEvent((QKeyEvent *)event);  
  10.                 if (!((QKeyEvent *)event)->isAccepted())  
  11.                         return false;  
  12.                 break;  
  13.                 // more...  
  14.         }  
  15.         return true;  

QWidget的event()函數使用一個巨大的switch來判斷QEvent的type,并且分發給不同的事件處理函數。在事件處理函數之后,使用這個事件的isAccepted()方法,獲知這個事件是不是被接受,如果沒有被接受則event()函數立即返回false,否則返回true。

另外一個必須重寫event()函數的情形是有自定義事件的時候。如果你的程序中有自定義事件,則必須重寫event()函數以便將自定義事件進行分發,否則你的自定義事件永遠也不會被調用。

創建事件過濾器和安裝事件過濾器

Qt創建了QEvent事件對象之后,會調用QObject的event()函數做事件的分發。有時候,你可能需要在調用event()函數之前做一些另外的操作,比如,對話框上某些組件可能并不需要響應回車按下的事件,此時,你就需要重新定義組件的event()函數。如果組件很多,就需要重寫很多次event()函數,這顯然沒有效率。為此,你可以使用一個事件過濾器,來判斷是否需要調用event()函數。

QOjbect有一個eventFilter()函數,用于建立事件過濾器。這個函數的簽名如下:

  1. virtual bool QObject::eventFilter ( QObject * watched, QEvent * event ) 

如果watched對象安裝了事件過濾器,這個函數會被調用并進行事件過濾,然后才輪到組件進行事件處理。在重寫這個函數時,如果你需要過濾掉某個事件,例如停止對這個事件的響應,需要返回true。

  1. bool MainWindow::eventFilter(QObject *obj, QEvent *event)  
  2.  {  
  3.          if (obj == textEdit) {  
  4.                  if (event->type() == QEvent::KeyPress) {  
  5.                          QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);  
  6.                          qDebug() << "Ate key press" << keyEvent->key();  
  7.                          return true;  
  8.                  } else {  
  9.                          return false;  
  10.                  }  
  11.          } else {  
  12.                  // pass the event on to the parent class  
  13.                  return QMainWindow::eventFilter(obj, event);  
  14.          }  
  15.  } 

上面的例子中為MainWindow建立了一個事件過濾器。為了過濾某個組件上的事件,首先需要判斷這個對象是哪個組件,然后判斷這個事件的類型。例如,我不想讓textEdit組件處理鍵盤事件,于是就首先找到這個組件,如果這個事件是鍵盤事件,則直接返回true,也就是過濾掉了這個事件,其他事件還是要繼續處理,所以返回false。對于其他組件,我們并不保證是不是還有過濾器,于是最保險的辦法是調用父類的函數。

在創建了過濾器之后,下面要做的是安裝這個過濾器。安裝過濾器需要調用installEventFilter()函數。這個函數的簽名如下:

  1. void QObject::installEventFilter ( QObject * filterObj ) 

這個函數是QObject的一個函數,因此可以安裝到任何QObject的子類,并不僅僅是UI組件。這個函數接收一個QObject對象,調用了這個函數安裝事件過濾器的組件會調用filterObj定義的eventFilter()函數。例如,textField.installEventFilter(obj),則如果有事件發送到textField組件是,會先調用obj->eventFilter()函數,然后才會調用textField.event()。

當然,你也可以把事件過濾器安裝到QApplication上面,這樣就可以過濾所有的事件,已獲得更大的控制權。不過,這樣做的后果就是會降低事件分發的效率。

如果一個組件安裝了多個過濾器,則最后一個安裝的會最先調用,類似于堆棧的行為。

注意,如果你在事件過濾器中delete了某個接收組件,務必將返回值設為true。否則,Qt還是會將事件分發給這個接收組件,從而導致程序崩潰。

事件過濾器和被安裝的組件必須在同一線程,否則,過濾器不起作用。另外,如果在install之后,這兩個組件到了不同的線程,那么,只有等到二者重新回到同一線程的時候過濾器才會有效。

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

小結:關于QT類 Qevent事件處理過程 事件過濾器 的內容介紹按了,希望本文對你有所幫助。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-29 16:14:59

Qt 事件 過濾器

2011-07-04 14:00:11

QT QEvent

2021-07-05 15:22:03

Servlet過濾器客戶端

2024-01-05 09:04:35

隆過濾器數據結構哈希函數

2011-07-01 14:14:34

Qt 事件

2011-07-01 14:20:59

Qt 事件

2024-11-04 08:45:48

布隆過濾器元數據指紋值

2009-09-29 13:55:23

Hibernate設置

2009-07-08 16:07:04

Servlet過濾器配

2009-07-08 15:30:56

Servlet過濾器

2009-07-14 09:09:08

Swing模型過濾器

2011-08-29 11:25:29

QTWebKit鼠標

2025-04-21 00:50:50

2009-06-18 10:13:00

Hibernate過濾

2009-09-25 15:19:44

Hibernate過濾

2009-07-08 17:33:37

Servlet過濾器

2017-07-18 14:10:31

大數據Apache Flum過濾器

2011-07-04 14:50:49

QT Event 事件

2011-08-29 14:59:26

QtEvent事件

2011-07-18 10:03:18

CocoaQt
點贊
收藏

51CTO技術棧公眾號

国产精品第三页| 欧美激情图片小说| 国产精彩视频在线观看| 国产在线高潮| 成人自拍在线| 中文字幕永久在线不卡| 成人国产精品日本在线| 无码人中文字幕| eeuss鲁片一区二区三区| 一区二区三区在线高清| www.一区二区三区| 探花国产精品一区二区| 亚洲精品在线观看91| 亚洲精品国产精品自产a区红杏吧| avav在线看| 日本精品在线| 91免费国产在线观看| 日本久久亚洲电影| 久草免费在线视频观看| 欧美美女一区| 欧美大片国产精品| 一级片视频免费观看| segui88久久综合| 91麻豆免费视频| 成人黄色在线观看| 无码人妻精品一区二区| 欧美日韩国产精品一区二区亚洲| 亚洲日韩第一页| 亚洲精品永久视频| 亚洲精品**中文毛片| 国产精品国产三级国产| 欧美一区二区高清在线观看| 亚洲毛片在线播放| 国产视频亚洲| 久久久久女教师免费一区| 国产精品成人无码专区| 日本精品国产| 欧美日韩国产美| 黄色影院一级片| 6—12呦国产精品| 国产精品一区亚洲| 欧美精品免费播放| 大胸美女被爆操| 性国裸体高清亚洲| 亚洲精品高清视频在线观看| 亚洲精品在线观看免费| 伦理片一区二区三区| 成人免费毛片app| av免费观看久久| 99在线精品视频免费观看20| 麻豆久久久久久久| 亚洲国产一区二区三区在线观看| 中文字幕一区二区在线观看视频| jk漫画禁漫成人入口| 91免费版在线| 久久久人人爽| 日本福利片高清在线观看| 成人免费毛片嘿嘿连载视频| 国产伦精品一区二区三区四区视频| 国产又粗又猛又爽又| 久久综合伊人| 欧美一级电影久久| 熟女少妇一区二区三区| 啪啪激情综合网| 日韩欧美一级片| 日本一二三四区视频| 精品一区二区三区在线观看视频| 7777精品伊人久久久大香线蕉经典版下载 | 日韩亚洲欧美成人一区| 欧美体内she精高潮| 欧美一级做a| 欧美久久久久久久久中文字幕| 成年网站在线播放| 中文幕av一区二区三区佐山爱| 欧美日韩一区二区免费视频| 虎白女粉嫩尤物福利视频| 丁香花在线影院| 黄色成人av在线| 日韩欧美在线播放视频| 小草在线视频免费播放| 欧美综合亚洲图片综合区| 欧美精品 - 色网| theporn国产在线精品| 亚洲精品999| 天堂av网手机版| 亚洲综合色网| 欧美巨大黑人极品精男| 精品无码一区二区三区电影桃花| 中文一区二区| 国产欧美精品一区二区三区-老狼| 青青艹在线观看| 国产精品456露脸| 久久久久久成人精品| 国内免费精品视频| 天堂一区二区在线| 成人在线视频福利| 成人激情四射网| 久久亚洲综合av| 亚洲图片欧洲图片日韩av| 精品美女www爽爽爽视频| 精品一区二区三区在线观看 | 亚洲三级黄色在线观看| 在线观看日本黄色| 国产精品99在线观看| 欧美区在线播放| 一本一道无码中文字幕精品热| 久久精品国产99国产| 国产综合色一区二区三区| 浮生影视网在线观看免费| 一区二区三区蜜桃| 欧美牲交a欧美牲交aⅴ免费下载| 97色婷婷成人综合在线观看| 国产婷婷成人久久av免费高清| 自拍偷拍第9页| 最新精品国产| 国产区精品视频| 视频午夜在线| 亚洲欧美色一区| 91午夜在线观看| 亚洲日本中文| 亚洲欧洲在线免费| 九九视频在线免费观看| 国产日韩欧美三区| 成人高清视频观看www| 你懂的在线看| 性做久久久久久免费观看| 青青草久久伊人| 久久91导航| 欧美一区二区三区在线观看| 日韩中文字幕电影| 亚洲在线免费| 精品不卡在线| 污污影院在线观看| 91精品国产色综合久久| 一级二级黄色片| 日韩精品乱码免费| 99三级在线| 先锋影音在线资源站91| 91精品福利视频| xxxxxx黄色| 国精品一区二区三区| 91超碰在线免费观看| 思思99re6国产在线播放| 精品日韩中文字幕| 一级黄色片毛片| 今天的高清视频免费播放成人| 亚洲a区在线视频| 中文国产字幕在线观看| 宅男在线国产精品| 国产探花在线免费观看| 国产成人在线免费| 人妻av无码专区| 免费一区二区三区在线视频| 欧美成人一区二区三区电影| 精品区在线观看| 一二三区精品视频| 无码任你躁久久久久久老妇| 日韩一级欧洲| 九九九九九九精品| 深夜成人在线| 亚洲高清不卡av| 亚洲AV无码成人精品区东京热| 97精品国产露脸对白| 青青艹视频在线| 美日韩中文字幕| 97视频免费看| 免费av网站观看| 色婷婷激情一区二区三区| 中文字幕av网址| 麻豆精品在线播放| 中文字幕日韩一区二区三区不卡| 日韩08精品| 2019中文字幕全在线观看| 人人妻人人澡人人爽久久av| 香蕉久久一区二区不卡无毒影院| 日韩www视频| 香蕉国产精品偷在线观看不卡| 日韩av图片| 日韩成人在线一区| 欧美成人免费全部| 手机看片福利永久| 狠狠色狠狠色综合日日五| 大黑人交xxx极品hd| 羞羞色国产精品网站| 国产精品第一视频| 亚洲奶水xxxx哺乳期| 日韩一级二级三级| 日韩免费视频一区二区视频在线观看| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 色婷婷综合久久久久久| 国产精品吊钟奶在线| 麻豆视频免费在线观看| 亚洲第一中文字幕在线观看| www.日本精品| 亚洲欧洲色图综合| 少妇被狂c下部羞羞漫画| 蜜桃一区二区三区在线| 欧美成人精品免费| 精品久久精品| 97人人模人人爽人人喊38tv| 亚洲淫成人影院| 久久久av一区| 涩涩视频在线观看免费| 日韩一级片网址| 免费黄色av片| 一区二区高清视频在线观看| 欧美日韩人妻精品一区在线| 日本在线不卡视频| 日韩a级在线观看| 成人a'v在线播放| 精品免费国产| 日韩欧国产精品一区综合无码| 久久av红桃一区二区小说| 日本一卡二卡四卡精品| 91精品欧美久久久久久动漫| 久久久精品视频网站| 亚洲一区二区在线免费看| 国产一二三四视频| 国产999精品久久| 中文字幕 欧美日韩| 国产精品美女| 欧美与动交zoz0z| 欧美偷拍自拍| 激情视频一区二区| 中文字幕日韩高清在线| 国产精品一区二区三区久久| 国产精品伦理| 欧美激情女人20p| 成人高清网站| 欧美成人精品高清在线播放| 日韩毛片一区二区三区| 国产精品嫩草99av在线| 妞干网这里只有精品| 久久91麻豆精品一区| 久久精品成人一区二区三区蜜臀| 婷婷视频一区二区三区| 国产精品一区二区女厕厕| 精品欧美一区二区三区在线观看| 9.1国产丝袜在线观看| 国产经典三级在线| 亚洲日韩第一页| 男人的天堂在线免费视频| 日韩精品免费在线| 午夜久久久久久噜噜噜噜| 欧美日韩午夜精品| 国产91在线免费| 一区二区影视| 免费观看亚洲视频| 国产一在线精品一区在线观看| 最新av在线免费观看| 亚洲一区二区日韩| 黄色一级片黄色| 亚洲欧美综合| 91免费黄视频| 99精品久久| 亚洲 欧美 日韩 国产综合 在线 | 欧美一a一片一级一片| 国产精品自拍99| 香蕉乱码成人久久天堂爱免费| 欧美成人精品欧美一级乱黄| 精品福利一区二区| 天天操天天干天天摸| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 毛片一区二区三区四区| 久热re这里精品视频在线6| 午夜dv内射一区二区| 蜜桃av一区二区在线观看| 国产精品va无码一区二区| 国产精品永久| 成人日韩在线视频| 高清成人免费视频| 中文字幕被公侵犯的漂亮人妻| 国产欧美精品一区二区色综合朱莉| 亚洲黄色小视频在线观看| 免费欧美日韩国产三级电影| 天堂av8在线| 成人黄色国产精品网站大全在线免费观看 | 日韩精品久久久久久久玫瑰园| 青青草娱乐在线| 亚洲全黄一级网站| 日本暖暖在线视频| 91高清视频在线免费观看| 欧美电影免费观看| 亚洲在线免费观看| 草莓视频一区二区三区| 欧美一区1区三区3区公司| 中文字幕一区二区三区乱码图片| 国产成人一区二区三区别| 国产视频一区免费看| 手机看片福利日韩| 成人午夜在线免费| 一级性生活大片| 91视频免费看| 四季av中文字幕| 午夜精品久久久久久| 精品国产乱子伦| 精品成人一区二区三区四区| 人成在线免费视频| 久久99热精品这里久久精品| 色豆豆成人网| 国产欧美日韩综合精品二区| 久久成人综合| 日韩精品一区二区三区久久| 日本不卡视频在线观看| 国产女主播在线播放| 国产精品久久毛片| 国产女同在线观看| 日韩午夜激情视频| 黄色片在线播放| 97视频免费在线观看| 亚洲开心激情| 在线视频不卡一区二区三区| 午夜影院日韩| 日本一区二区在线观看视频| 91蝌蚪porny成人天涯| 国产va在线播放| 欧美日韩美女一区二区| 你懂的视频在线免费| 久久久久久久久久久国产| 免费在线观看一区| 国产精品伊人日日| 欧美一区二区| 日本77777| 国产欧美日韩久久| 免费视频网站在线观看入口| 亚洲国产日韩欧美在线图片| av免费在线观| 51成人做爰www免费看网站| 日韩免费特黄一二三区| www.中文字幕在线| 国产美女精品一区二区三区| 日韩免费在线播放| 国内精品偷拍| av磁力番号网| 精品一区二区三区免费观看| 黄色a一级视频| 一区2区3区在线看| 国产三区在线播放| 日韩在线视频一区| 日本一道高清亚洲日美韩| 成人免费视频网站| 色狠狠一区二区三区| 欧美日韩一区二区视频在线| 亚洲视频综合| 亚洲精品激情视频| 国产精品无码永久免费888| 中文字幕+乱码+中文| 国产精品免费视频一区| 国产偷人爽久久久久久老妇app| 亚洲丝袜av一区| 日本综合视频| 亚洲高清资源综合久久精品| 日本不卡123| 性爱在线免费视频| 欧美日韩欧美一区二区| 亚洲av成人无码网天堂| 一区二区三区不卡视频在线观看| 91精品国产乱码久久久久| 日韩在线欧美在线| 97精品资源在线观看| 女人帮男人橹视频播放| 成人av网站在线观看| 欧美精品色哟哟| 欧美成人精品3d动漫h| 国产精品—色呦呦| 成人国产精品久久久| 国内激情久久| 国产精品扒开腿做爽爽爽a片唱戏| 五月天精品一区二区三区| 你懂的视频在线免费| 国产日韩综合一区二区性色av| 中文字幕精品影院| 青青草视频国产| 丰满亚洲少妇av| av资源免费观看| xvideos国产精品| 香蕉免费一区二区三区在线观看 | 国产欧美精品一区二区三区介绍| 欧美69wwwcom| 日韩Av无码精品| 欧美三区免费完整视频在线观看| 1区2区3区在线观看| 99re在线观看视频| 一本久道久久综合婷婷鲸鱼| 色哟哟视频在线| 五月天丁香久久| 黄色毛片在线观看| 99视频免费观看| 在线一区视频| 99自拍视频在线| 欧美xxxx在线观看| 最新日韩一区| 男女啪啪免费观看| 久久久久亚洲蜜桃| 亚洲天堂avav| 91高清免费在线观看| 日韩欧美综合| 欧美 日本 国产| 欧美精品久久99| 黑人玩欧美人三根一起进|