精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产成人在线电影| 国产精品传媒麻豆hd| 成人三级伦理片| 日韩av电影手机在线| 91香蕉视频污在线观看| 视频一区日韩| 欧美日韩中文字幕在线| 日韩在线三区| 99热这里只有精品66| 在线午夜精品| 久久这里只有精品99| 国产精品无码在线| 四虎在线精品| 色综合久久综合中文综合网| 熟妇熟女乱妇乱女网站| 日本韩国精品一区二区| 激情综合五月天| 日本aⅴ大伊香蕉精品视频| 国产精品丝袜一区二区| 最新国产精品视频| 欧美成人r级一区二区三区| 亚洲天堂av线| rebdb初裸写真在线观看| 日韩理论片网站| 日韩久久精品一区二区三区| 色一情一乱一区二区三区| 免费高清成人在线| 91精品国产色综合| 久久久久亚洲AV成人| 成人6969www免费视频| 亚洲精品电影网在线观看| av影片在线播放| 欧美特黄色片| 欧美在线999| 黄色片久久久久| av2020不卡| 亚洲黄色录像片| 男插女免费视频| 黄色网在线免费看| 亚洲国产精品成人综合| 免费av在线一区二区| 色wwwwww| 99久久久久久99| 国产一区免费在线| 国产18精品乱码免费看| 国产精品一级在线| 亚洲wwwav| 99视频免费看| 国产一区二区电影| 成人啪啪免费看| 国产又粗又猛又黄又爽无遮挡| 日本成人中文字幕在线视频| 国产91在线播放九色快色| 日韩一区二区视频在线| 国产精品一区毛片| 欧美在线精品免播放器视频| 亚洲天堂一区在线观看| 国产精品久久国产愉拍| 欧美最猛性xxxxx(亚洲精品)| 久久久久久久极品| 久久成人精品| 国产精品jvid在线观看蜜臀 | 一区二区三区在线影院| 亚洲天堂av免费在线观看| 国产精品实拍| 亚洲激情在线激情| 女人床在线观看| 牛牛在线精品视频| 五月天一区二区三区| 国产最新免费视频| 亚洲成人看片| 欧美日韩免费观看一区二区三区| 日本人69视频| 视频欧美一区| 日韩精品中文字幕视频在线| 精品无码国产污污污免费网站 | 中文字幕亚洲二区| 51精品免费网站| 狠狠色综合网| 日本高清视频一区| 亚洲综合网av| 成人免费视频一区二区| 日本一区二区精品| 黄网站在线免费| 天天色图综合网| 一区二区成人网| 国产乱码精品一区二区三区亚洲人| 精品国产百合女同互慰| 五十路六十路七十路熟婆| av一区二区高清| 欧美成人午夜免费视在线看片| 国产成人亚洲欧洲在线| 秋霞电影网一区二区| 97人人模人人爽人人少妇| 青青草视频在线免费观看| 国产精品福利一区| 91视频 -- 69xx| 国产精品久久久久久久久久久久久久久 | 国产xxxxx在线观看| 亚洲精品成a人ⅴ香蕉片| 精品蜜桃在线看| 国产精品久久久久久久av| 狠狠爱www人成狠狠爱综合网| 青青青国产精品一区二区| 国产欧美日韩成人| 久久免费美女视频| 可以在线看黄的网站| 国产另类xxxxhd高清| 欧美成人激情免费网| 人成免费在线视频| 99热在线精品观看| 91精品免费视频| 国产在线一二三| 亚洲成av人片| 樱花草www在线| 欧洲美女日日| 欧美在线xxx| 成人av无码一区二区三区| 日本一区二区在线不卡| 夜夜添无码一区二区三区| 日本一区二区三区中文字幕| 亚洲欧美中文日韩在线v日本| 久久精品国产亚洲av高清色欲 | 国产精品一区二区三| 深爱激情五月婷婷| 一区二区三区高清| 日本一二三区在线| 日韩欧美综合| 国产精品久久999| 欧美中文在线| 精品国产乱码久久久久酒店| 欧美老女人bb| 亚洲色图二区| 国产日本欧美视频| 91在线视频免费看| 一本色道亚洲精品aⅴ| 午夜不卡久久精品无码免费| 欧美1区2区视频| 91视频免费网站| 黄网站在线免费| 69成人精品免费视频| 91香蕉视频网| 久久99精品久久久久久国产越南 | 精品欧美国产| 久草在线中文最新视频| 亚洲国产精品久久久久秋霞蜜臀| 国产一级性生活| 成人丝袜18视频在线观看| 97久久国产亚洲精品超碰热| 一区中文字幕电影| 午夜精品久久久久久久99热浪潮 | eeuss国产一区二区三区| 久久久久久久香蕉| 亚洲一区 二区| 国内精品视频一区| 天堂中文资源在线观看| 精品国产91久久久久久老师| 好吊一区二区三区视频| 欧美中文字幕| 亚洲欧美国产一区二区| 激情亚洲小说| 久精品免费视频| 亚洲h视频在线观看| 亚洲成人免费在线| 韩国无码一区二区三区精品| 久久亚洲国产精品一区二区| 日韩videos| 国产乱码精品一区二区三区亚洲人 | 69久久夜色精品国产69蝌蚪网| 中文字幕人妻一区二| 国产成人三级在线观看| 免费看国产曰批40分钟| 精品国产91乱码一区二区三区四区 | 国产麻豆一区| 久久综合色影院| 人妻精品无码一区二区| 一本到不卡精品视频在线观看| 日韩精品电影一区二区三区| 国产一区二区久久| 久久久亚洲精品无码| 精品久久久久久久| 成人免费激情视频| 色综合桃花网| 中文字幕日韩在线播放| 亚洲AV无码精品自拍| 欧美午夜宅男影院在线观看| 女同久久另类69精品国产| 成人黄色av电影| 三年中国国语在线播放免费| 一本一本久久a久久综合精品| 久久精品中文字幕一区二区三区| 久久精品国产精品亚洲毛片| 国内精品400部情侣激情| av福利在线播放| 亚洲国产一区自拍| 国产一区二区在线视频聊天| 亚洲va天堂va国产va久| 俄罗斯毛片基地| 成人午夜视频福利| 一区二区三区国产免费| 亚洲高清电影| 丰满女人性猛交| 一本色道久久综合狠狠躁的番外| 91久久久久久久久| 在线手机中文字幕| 欧美高跟鞋交xxxxhd| 国产精品天堂| 亚洲精品99久久久久| 国产又粗又猛又爽又黄视频| 色偷偷88欧美精品久久久| 美国黄色小视频| 欧美国产精品v| 在线黄色免费网站| 国产一区啦啦啦在线观看| 成人在线观看a| 亚洲国产日本| 欧美日韩中文字幕在线播放| 日韩欧美一区二区三区在线视频| 麻豆亚洲一区| 久久久久影视| 国产精品theporn88| **精品中文字幕一区二区三区| 国产999精品| 九九精品调教| 欧美成人免费观看| 日本在线观看免费| 亚洲最新在线视频| 免费一级毛片在线观看| 亚洲精品videossex少妇| 精品国自产在线观看| 777午夜精品视频在线播放| 亚洲成人第一网站| 欧美日韩在线视频观看| 日本亚洲欧美在线| 亚洲国产一二三| 九九视频免费在线观看| 亚洲人妖av一区二区| а天堂中文在线资源| 欧美国产精品v| 欧美一区二区三区粗大| 中文字幕第一区二区| 欧美黄色一级生活片| 久久精品视频一区二区| 国产精品毛片一区二区| 久久这里只有精品6| www在线观看免费视频| 久久久久国产精品麻豆| 国产高潮呻吟久久| 国产欧美日韩在线| 五月激情四射婷婷| 国产精品理论在线观看| 亚洲区一区二区三| 亚洲视频在线观看一区| 强行糟蹋人妻hd中文| 亚洲高清视频在线| 国产成人在线观看网站| 欧美日韩一二三四五区| 人妻丰满熟妇av无码区| 在线观看www91| 一区二区三区在线免费观看视频 | 亚洲主播在线观看| 免费在线观看黄视频| 午夜激情一区二区| 69视频免费在线观看| 欧洲激情一区二区| 国产精品视频第一页| 欧美v日韩v国产v| 午夜一区在线观看| 亚洲人成在线观| 日本在线观看免费| 欧美精品video| 性感美女一区二区在线观看| 成人激情电影一区二区| 中文无码日韩欧| 麻豆久久久9性大片| 日韩精品影视| 日本香蕉视频在线观看| 亚洲综合好骚| 国产永久免费网站| 成人午夜免费av| 少妇一级黄色片| 亚洲一区二区成人在线观看| 黄色一级视频免费看| 8x8x8国产精品| 五月婷婷丁香网| 色偷偷888欧美精品久久久| 欧美hdxxx| 国产精品美乳在线观看| 亚洲天堂av资源在线观看| 日本在线成人一区二区| 亚洲午夜精品一区 二区 三区| 国产a级片网站| 久久精品国产在热久久| 一级黄色片毛片| 国产精品麻豆欧美日韩ww| 国产一级淫片免费| 在线观看视频一区二区欧美日韩| 亚洲精品国产片| 国产亚洲精品一区二区| 美足av综合网| 国产一区私人高清影院| 欧美精品中文| 免费极品av一视觉盛宴| 日本成人在线电影网| 亚洲一区二区三区四区av| 国产精品国产三级国产a| 欧美福利视频一区二区| 日韩午夜在线播放| 日韩在线资源| 国产成人综合精品在线| 欧美爱爱网站| 欧美日韩激情四射| 久久精品国产亚洲一区二区三区| 国产麻豆天美果冻无码视频| 亚洲制服丝袜一区| 国产精品自产拍| 伊人久久久久久久久久久久久 | 一本大道久久a久久综合| 亚洲黄色在线观看视频| 久久夜色精品亚洲噜噜国产mv| 成人激情综合| 精品一区二区三区国产| 亚洲性人人天天夜夜摸| 欧美体内she精高潮| 中文字幕欧美一| 国产天堂第一区| 亚洲欧美一区二区三区在线| www.超碰在线| 国产伦精品一区二区三区视频黑人| 亚洲一区 二区 三区| 亚洲18在线看污www麻豆| 一区二区中文字幕在线| 中文在线观看免费高清| 亚洲色图五月天| 欧美大片免费高清观看| 久久伊人一区二区| 亚洲经典视频在线观看| 日本精品一二三区| 亚洲一区二区三区爽爽爽爽爽| 亚洲爱情岛论坛永久| 欧美日本亚洲视频| 麻豆视频久久| 国产精品无码电影在线观看| 国产a久久麻豆| 免费一级片在线观看| 欧美大片拔萝卜| 国产美女情趣调教h一区二区| 波多野结衣成人在线| 欧美日韩一区二区国产| 女王人厕视频2ⅴk| 夜夜精品视频一区二区| 国产 日韩 欧美 综合| 91精品国产乱码久久久久久久久| 欧美绝顶高潮抽搐喷水合集| 国产亚洲欧美在线视频| 久久久久久久久伊人| 亚洲精品久久久久久久蜜桃| 在线性视频日韩欧美| 一区在线不卡| 黄色一级大片免费| 成人免费看的视频| 久久精品无码av| 中文字幕久热精品视频在线| 成人国产精品久久| 欧美狂野激情性xxxx在线观| 99久久精品国产导航| 精品无码一区二区三区的天堂| 视频一区视频二区国产精品| 国产亚洲观看| 日韩av高清在线看片| 国产喂奶挤奶一区二区三区| 一级特黄aaa大片| 欧美精品电影免费在线观看| 偷拍一区二区| 亚欧激情乱码久久久久久久久| 亚洲欧美另类在线| 欧美一区二区三区激情| 国产精品av在线播放| 最新欧美人z0oozo0| 一区二区三区少妇| 欧美日韩在线直播| 久久不射影院| 日韩一区免费观看| 成人亚洲一区二区一| www.日韩一区| 九色精品免费永久在线| 蜜臀91精品国产高清在线观看| 亚洲欧美天堂在线| 性感美女久久精品| av网站在线播放| 成人做爰66片免费看网站| 美女久久一区| 久久久久无码国产精品不卡| 国产亚洲精品91在线| gogo人体一区| 自拍偷拍21p| 欧美日韩国产精品一区二区三区四区 | 成人精品在线播放| 国产精品成人v| 亚洲精品社区|