成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解 Qt 事件過濾器

移動開發
本文介紹的是Qt 事件過濾器,對于Qt事件過濾器有很詳細的講解,先來看內容。

Qt 事件過濾器是本文要介紹的內容,Qt 事件模型一個真正強大的特色是一個QObject的實例能夠管理另一個QObject 實例的事件

讓我們試著設想已經有了一個CustomerInfoDialog的小部件。CustomerInfoDialog 包含一系列QLineEdit. 現在,我們想用空格鍵來代替Tab,使焦點在這些QLineEdit間切換。

一個解決的方法是子類化QLineEdit,重新實現keyPressEvent(),并在keyPressEvent()里調用focusNextChild()。像下面這樣:

  1. void MyLineEdit::keyPressEvent(QKeyEvent *event)   
  2. {   
  3.      if (event->key() == Qt::Key_Space) {   
  4.          focusNextChild();   
  5.      } else {   
  6.          QLineEdit::keyPressEvent(event);   
  7.      }   
  8. }  

但這有一個缺點。如果CustomerInfoDialog里有很多不同的控件(比如QComboBox,QEdit,QSpinBox),我們就必須子類化這么多控件。這是一個煩瑣的任務。

一個更好的解決辦法是: 讓CustomerInfoDialog去管理他的子部件的按鍵事件,實現要求的行為。我們可以使用事件過濾器

一個事件過濾器的安裝需要下面2個步驟:

1、調用installEventFilter()注冊需要管理的對象。

2、在eventFilter() 里處理需要管理的對象的事件。

一般,推薦在CustomerInfoDialog的構造函數中注冊被管理的對象。像下面這樣:

  1. CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)     : QDialog(parent){     ...      
  2.      firstNameEdit->installEventFilter(this);  
  3.      lastNameEdit->installEventFilter(this);  
  4.      cityEdit->installEventFilter(this);  
  5.      phoneNumberEdit->installEventFilter(this);  
  6. }  

一旦,事件管理器被注冊,發送到firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit的事件將首先發送到eventFilter()。

下面是一個 eventFilter()函數的實現:

  1. bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)   
  2. {   
  3.      if (target == firstNameEdit || target == lastNameEdit   
  4.              || target == cityEdit || target == phoneNumberEdit) {   
  5.          if (event->type() == QEvent::KeyPress) {   
  6.              QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);   
  7.              if (keyEvent->key() == Qt::Key_Space) {   
  8.                  focusNextChild();   
  9.                  return true;   
  10.              }   
  11.          }   
  12.      }   
  13.      return QDialog::eventFilter(target, event);   
  14. }  

在上面的函數中,我們首先檢查目標部件是否是 firstNameEdit,lastNameEdit,cityEdit,phoneNumberEdit。接著,我們判斷事件是否是按鍵事件。如果事件是按鍵事件,我們把事件轉換為QKeyEvent。接著,我們判斷是否按下了空格鍵,如果是,我們調用focusNextChild(),把焦點傳遞給下一個控件。然后,返回,true通知Qt,我們已經處理了該事件。

如果返回false的話,Qt繼續將該事件發送給目標控件,結果是一個空格被插入到QLineEdit中。

如果目標控件不是 QLineEdit,或者按鍵不是空格鍵,我們將把事件傳遞給基類的eventFilter()函數。

Qt提供5個級別的事件處理和過濾:

1、重新實現事件函數。 比如: mousePressEvent(), keyPress-Event(),   paintEvent() 。

這是最常規的事件處理方法。
  
2、重新實現QObject::event().

這一般用在Qt沒有提供該事件的處理函數時。也就是,我們增加新的事件時。
  
3、安裝事件過濾器

4、在 QApplication 上安裝事件過濾器

這之所以被單獨列出來是因為: QApplication 上的事件過濾器將捕獲應用程序的所有事件,而且***個獲得該事件。也就是說事件在發送給其它任何一個event filter之前發送給QApplication的event filter。

5、重新實現QApplication 的 notify()方法.

Qt使用 notify()來分發事件。要想在任何事件處理器捕獲事件之前捕獲事件,***的方法就是重新實現QApplication 的 notify()方法。

小結:關于Qt 事件過濾器的內容介紹完了,希望本文對你有所幫助。如果需要更多內容,請參考編輯推薦。

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

2011-07-04 14:38:43

QT Qevent

2009-07-08 16:07:04

Servlet過濾器配

2016-12-07 09:56:13

JavaFilter過濾器

2017-04-12 14:43:01

Spring ClouZuul過濾器

2021-07-05 15:22:03

Servlet過濾器客戶端

2024-01-05 09:04:35

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

2021-01-14 08:13:39

Spring Clou應用內置過濾器

2024-11-04 08:45:48

布隆過濾器元數據指紋值

2009-07-08 15:30:56

Servlet過濾器

2009-07-14 09:09:08

Swing模型過濾器

2009-09-29 13:55:23

Hibernate設置

2009-06-18 10:13:00

Hibernate過濾

2025-04-21 00:50:50

2017-07-18 14:10:31

大數據Apache Flum過濾器

2009-09-25 15:19:44

Hibernate過濾

2009-07-08 17:33:37

Servlet過濾器

2024-03-15 11:21:22

布隆過濾器數據庫數據

2009-07-06 13:02:49

Servlet過濾器

2023-01-26 01:41:27

核心全局過濾器

2023-04-14 09:01:25

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区四区在线观看 | 在线观看免费av网 | 日韩伦理电影免费在线观看 | 中文字幕亚洲欧美 | 韩日免费视频 | 欧美一区不卡 | 一区二区三区精品视频 | 在线免费观看黄色 | 三级黄色大片网站 | 国产成人在线播放 | 一区二区三区在线免费观看 | 丁香婷婷综合激情五月色 | 亚洲第一成年免费网站 | 亚洲国产成人精品在线 | 91精品国产91久久综合桃花 | 日韩欧美视频 | 国产在线精品一区二区 | 天堂久久天堂综合色 | av免费网站在线观看 | 一区二区在线视频 | 日韩视频免费 | 欧美成人精品激情在线观看 | 国产精品日产欧美久久久久 | 国产精久久久久久久 | 伊人欧美视频 | 亚洲精品9999 | 久久久久久久久久久久久9999 | 精品一区二区三 | 亚洲另类视频 | 激情欧美一区二区三区中文字幕 | eeuss国产一区二区三区四区 | 日韩亚洲一区二区 | 久在线 | 精品国产乱码久久久久久丨区2区 | 国产成人免费 | 丁香一区二区 | 国产日韩欧美精品一区二区三区 | 亚洲一区中文字幕 | 国产精品欧美一区二区三区不卡 | 国产精品一区二区三 | 免费看片在线播放 |