偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

詳解 Qt 事件過(guò)濾器

移動(dòng)開發(fā)
本文介紹的是Qt 事件過(guò)濾器,對(duì)于Qt事件過(guò)濾器有很詳細(xì)的講解,先來(lái)看內(nèi)容。

Qt 事件過(guò)濾器是本文要介紹的內(nèi)容,Qt 事件模型一個(gè)真正強(qiáng)大的特色是一個(gè)QObject的實(shí)例能夠管理另一個(gè)QObject 實(shí)例的事件。

讓我們?cè)囍O(shè)想已經(jīng)有了一個(gè)CustomerInfoDialog的小部件。CustomerInfoDialog 包含一系列QLineEdit. 現(xiàn)在,我們想用空格鍵來(lái)代替Tab,使焦點(diǎn)在這些QLineEdit間切換。

一個(gè)解決的方法是子類化QLineEdit,重新實(shí)現(xiàn)keyPressEvent(),并在keyPressEvent()里調(diào)用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. }  

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

一個(gè)更好的解決辦法是: 讓CustomerInfoDialog去管理他的子部件的按鍵事件,實(shí)現(xiàn)要求的行為。我們可以使用事件過(guò)濾器

一個(gè)事件過(guò)濾器的安裝需要下面2個(gè)步驟:

1、調(diào)用installEventFilter()注冊(cè)需要管理的對(duì)象。

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

一般,推薦在CustomerInfoDialog的構(gòu)造函數(shù)中注冊(cè)被管理的對(duì)象。像下面這樣:

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

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

下面是一個(gè) eventFilter()函數(shù)的實(shí)現(xiàn):

  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. }  

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

如果返回false的話,Qt繼續(xù)將該事件發(fā)送給目標(biāo)控件,結(jié)果是一個(gè)空格被插入到QLineEdit中。

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

Qt提供5個(gè)級(jí)別的事件處理和過(guò)濾:

1、重新實(shí)現(xiàn)事件函數(shù)。 比如: mousePressEvent(), keyPress-Event(),   paintEvent() 。

這是最常規(guī)的事件處理方法。
  
2、重新實(shí)現(xiàn)QObject::event().

這一般用在Qt沒(méi)有提供該事件的處理函數(shù)時(shí)。也就是,我們?cè)黾有碌氖录r(shí)。
  
3、安裝事件過(guò)濾器

4、在 QApplication 上安裝事件過(guò)濾器

這之所以被單獨(dú)列出來(lái)是因?yàn)椋?QApplication 上的事件過(guò)濾器將捕獲應(yīng)用程序的所有事件,而且***個(gè)獲得該事件。也就是說(shuō)事件在發(fā)送給其它任何一個(gè)event filter之前發(fā)送給QApplication的event filter。

5、重新實(shí)現(xiàn)QApplication 的 notify()方法.

Qt使用 notify()來(lái)分發(fā)事件。要想在任何事件處理器捕獲事件之前捕獲事件,***的方法就是重新實(shí)現(xiàn)QApplication 的 notify()方法。

小結(jié):關(guān)于Qt 事件過(guò)濾器的內(nèi)容介紹完了,希望本文對(duì)你有所幫助。如果需要更多內(nèi)容,請(qǐng)參考編輯推薦。

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-04 14:38:43

QT Qevent

2009-07-08 16:07:04

Servlet過(guò)濾器配

2016-12-07 09:56:13

JavaFilter過(guò)濾器

2017-04-12 14:43:01

Spring ClouZuul過(guò)濾器

2021-07-05 15:22:03

Servlet過(guò)濾器客戶端

2024-01-05 09:04:35

隆過(guò)濾器數(shù)據(jù)結(jié)構(gòu)哈希函數(shù)

2021-01-14 08:13:39

Spring Clou應(yīng)用內(nèi)置過(guò)濾器

2024-11-04 08:45:48

布隆過(guò)濾器元數(shù)據(jù)指紋值

2009-07-08 15:30:56

Servlet過(guò)濾器

2009-07-14 09:09:08

Swing模型過(guò)濾器

2009-09-29 13:55:23

Hibernate設(shè)置

2025-04-21 00:50:50

2009-06-18 10:13:00

Hibernate過(guò)濾

2017-07-18 14:10:31

大數(shù)據(jù)Apache Flum過(guò)濾器

2009-07-08 17:33:37

Servlet過(guò)濾器

2009-09-25 15:19:44

Hibernate過(guò)濾

2024-03-15 11:21:22

布隆過(guò)濾器數(shù)據(jù)庫(kù)數(shù)據(jù)

2009-07-06 13:02:49

Servlet過(guò)濾器

2023-04-14 09:01:25

2023-01-26 01:41:27

核心全局過(guò)濾器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)