1. 程式人生 > >QT事件的處理

QT事件的處理

1、事件的派發和處理

      事件過濾器是Qt中一個獨特的事件處理機制, 功能強大而且使用起來靈活方便。通過事件過濾器, 可以讓一個物件偵聽攔截另外一個物件的事件。事件過濾器實現如下: 在所有Qt物件的基類QObject中有一個型別為QObjectList的成員變數,名字為eventFilters,當某個QObject(A)給另一個QObject(B)安裝了事件過濾器後, B會把A的指標儲存在eventFilters中。在B處理事件前,會先去檢查eventFilters列表, 如果非空, 就先呼叫列表中物件的eventFilter()函式。一個物件可以給多個物件安裝過濾器,一個物件能同時被安裝多個過濾器, 在事件到達之後, 事件過濾器以安裝次序的反序被呼叫。事件過濾器函式( eventFilter() ) 返回值是bool型, 如果返回true, 則表示事件已經被處理完畢, Qt將直接返回, 進行下一事件的處理。如果返回false, 事件將接著被送往剩下的事件過濾器或是目標物件進行處理。

      QT中,事件的派發是從 QApplication::notify()開始的, 因為QAppliction也是繼承自QObject,所以先檢查QAppliation物件, 如果有事件過濾器安裝在qApp上, 先呼叫事件過濾器,接下來QApplication::notify()會過濾或合併一些事件(比如失效widget的滑鼠事件會被過濾掉, 而同一區域重複的繪圖事件會被合併),事件被送到reciver::event()處理。

       在reciver::event()中, 先檢查有無事件過濾器安裝在reciever上。若有, 則呼叫之。然後根據QEvent的型別,呼叫相應的特定事件處理函式。常見的事件都有特定事件處理函式, 比如:mousePressEvent(), focusOutEvent(), resizeEvent(), paintEvent(), resizeEvent()等等。在實際應用中, 經常需要過載特定事件處理函式處理事件。對於不常見的事件, 沒有相對應的特定事件處理函式,如果要處理這些事件, 就需要使用別的辦法, 比如過載event()函式, 或是安裝事件過濾器。

2、事件的轉發

       對於某些類別的事件,如果在整個事件的派發過程結束後還沒有被處理, 那麼這個事件將會向上轉發給它的父widget, 直到最頂層視窗。Qt中和事件相關的函式通過兩種方式相互通訊,一種是QApplication::notify(),QObject::eventFilter(), QObject::event()通過返回bool值來表示是否已處理;另一種是呼叫QEvent::ignore() 或 QEvent::accept() 對事件進行標識,只用於event()函式和特定事件處理函式之間的溝通,而且只有用在某些類別事件上是有意義的, 這些事件就是上面提到的那些會被轉發的事件, 包括: 滑鼠, 滾輪, 按鍵等事件。

3、事件的處理、過濾

       QT提供了五種不同級別的事件處理和過濾:

1)重寫特定事件處理函式.

       最常見的事件處理辦法就是重寫mousePressEvent(),keyPressEvent(), paintEvent() 等特定事件處理函式。

2)重寫event()函式.

       重寫event()函式時, 需要呼叫父類的event()函式來處理不需要處理或是不清楚如何處理的事件。

returnQWidget::event(event);

3)在Qt物件上安裝事件過濾器

      安裝事件過濾器有兩個步驟: (假設要用A來監視過濾B的事件)

      首先呼叫B的installEventFilter( const QOject *obj ), 以A的指標作為引數,所有發往B的事件都將先由A的eventFilter()處理。然後, A要重寫QObject::eventFilter()函式, 在eventFilter() 中對事件進行處理。

4)給QAppliction物件安裝事件過濾器

       如果給QApplication物件裝上過濾器,那麼所有的事件在發往任何其他的過濾器時,都要先經過當前eventFilter()。在QApplication::notify() 中, 是先呼叫qApp的過濾器, 再對事件進行分析, 以決定是否合併或丟棄。

5)繼承QApplication類,並重載notify()函式

        Qt是用QApplication::notify()函式來分發事件的,要在任何事件過濾器檢視任何事件之前先得到這些事件,重寫notify()函式是唯一的辦法。通常來說事件過濾器更好用一些, 因為不需要去繼承QApplication類,而且可以給QApplication物件安裝任意個數的事件過濾器。

相關推薦

初步剖析QT事件處理全過程(Windows)

職責 spa message alt cati 窗口 初步 負責 啟動 一、說起Qt事件處理,在windows平臺下,當然離不開Win32: Win32程序的基本結構:  1.註冊窗口;  2.創建窗口;  3.啟動由GetMessage和DispatchMessage構成

Qt ------ 事件處理機制

後處理 分發 異步 ant ont 事件循環 tar rpo 基類 簡介 在Qt中,事件被封裝成一個個對象,所有的事件均繼承自抽象類QEvent。Qt是以事件驅動UI工具集。Signals/Slots在多線程中的實現也是依賴於Qt的事件處理機制。在Qt中,事件被封裝成一個個

17.QT-事件處理分析、事件過濾器、拖放事件

期待 使用 lis 相關 事件處理 [] 支持 實現 endif Qt事件處理介紹 Qt平臺會將系統產生的消息轉換為Qt事件 Qt事件是一個QEvent的對象 Qt事件用來描述程序內部或外部發生的動作 任意的QObject對象都具備事件處理的能力 Qt常見

QT開發——QT事件處理機制

ref:https://blog.csdn.net/A642960662/article/details/66473871 一、QT事件簡介     QT程式是事件驅動的, 程式的每個動作都是由內部某個事件所觸發。QT事件的發生和處理成為程式執行的主線

Qt事件處理機制整個流程--以滑鼠在一個視窗中點選為例

轉載自:http://mobile.51cto.com/symbian-272812.htm,在此謝謝原作者的分享! ------------------------第一部分----------------------   本篇來介紹Qt 事件處理機制 。深入瞭解事件處理系統對

Qt事件處理

Qt事件處理 Qt事件處理的五個層次 Qt 應用程式 事件處理 的五個層次,同時也是時間流程如下圖所示: 說明如下: sendEvent()會把event直接傳送給QCoreApplication的notify(),postEvent()把event追加到事件佇列中最終也要呼叫notify(

QT事件處理(以按鈕為例子)

<iframe id="cproIframe_u1788635_2" width="336" height="280" src="http://pos.baidu.com/acom?adn=3&amp;at=231&amp;aurl=&amp;cad=1&amp;cc

qt事件處理流程

前面的章節中我們曾經提到event()函式。事件物件建立完畢後,Qt 將這個事件物件傳遞給QObject的event()函式。event()函式並不直接處理事件,而是將這些事件物件按照它們不同的型別,分發給不同的事件處理器(event handler)。 如

python3+PyQt5 重新實現QT事件處理程式

本文是對《Python Qt GUI快速程式設計》的第10章的例子events用Python3+PyQt5進行改寫,涉及到重新實現QWidget的事件處理程式。本例子涉及到上下文選單,滑鼠事件,鍵盤事件,可作為重新實現事件處理程式的參考。 注:在建立上下文選單

Qt事件處理的使用方法

總結一下今天工作中學到的要點:今天在工作中,主要遇到了一個事件相關的問題,就是我在編寫一個Qt控制元件的時候,想要為這個控制元件增加一個事件處理!這裡用到了Qt的事件處理模組。一般常用的按鈕QPushButton控制元件本身就有單擊事件,因此只要單擊就會觸發cl

Qt事件處理(五)——定時器

目錄 前言 因為需要在開發板上無法直接使用OpenCV的攝像頭獲取事件來獲取視訊幀進行處理,而前面已經移植好了v4l2驅動攝像頭,這時候需要對影象進行進一步的處理,需要用到定時器來獲取視訊

Qt事件機制(是動作發生後,一種通知對象的消息,是被動與主動的總和。先處理自己隊列中的消息,然後再處理系統消息隊列中的消息)

str 發送 filter 簡化 後者 nts 類型 min() 鼠標滾輪 Qt事件機制 Qt程序是事件驅動的, 程序的每個動作都是由幕後某個事件所觸發.。 Qt事件的發生和處理成為程序運行的主線,存在於程序整個生命周期。 Qt事件的類型很多, 常見的qt的事件如下:

Qt中的事件處理機制(event)

Qt事件也就是Qt程式中出現的一系列“事情”,包括對使用者操作做出反應時發出的滑鼠或鍵盤事件等;以及系統內部自動發出的定時器事件等。總之,出現了這些事件後就需要對這些事件進行處理,處理的方法便是“事件處理機制”。 圖1 Qt事件產生 以

控制元件巢狀中的QT滑鼠事件處理機制

想實現在層層佈局的控制元件中,對最外層的QLabel上的滑鼠事件實現tracking,即觸發mouseMoveEvent的時候,不需要一直按著 前提:自定義控制元件,繼承QLabel重寫滑鼠事件相應的方法 可參考:https://wiki.qt.io/Clickable_QLabel

accept()函式用來告訴Qt事件處理函式“接收”了這個事件,不要再傳遞;ignore()函式則告訴Qt事件處理函式“忽略”了這個事件,需要繼續傳遞(看一下QWidget::mousePressEvent的實現,最為典型。如果希望忽略事件,只要呼叫父類的響應函式即可)

QEvent的accept()和ignore()一般不會用到,因為不如直接呼叫QWidget類的事件處理函式直接,而且作用是一樣的,見下面的例子。 推薦直接呼叫QWidget的事件處理函式。而不是呼叫accept()和ignore()。   只有一種情況下,必須使用呼叫accept()和ign

剖析Qt 事件的產生、分發、接受、處理流程

Windows上Qt事件處理機制詳解: 1、誰來產生事件: 最容易想到的是我們的輸入裝置,比如鍵盤、滑鼠產生的 keyPressEvent,keyReleaseEvent,mousePressEvent,mouseReleaseEvent事件(他們被封裝成QMouse

Qt GUI 通過滑鼠事件剖析整個事件處理流程(基於Qt4.5.2原始碼windows平臺)

/*以下分析的是Windows平臺 Qt GUI程式的事件產生,分發,處理全過程(基於Qt5.4.2原始碼整理) 以一個滑鼠按壓的事件為例子講述 ...表示省略掉一些程式碼(skip code) 事件起源: 基於事件如何被產生與分發,可以把事件分為以下三類。 Spon

QT事件處理

1、事件的派發和處理      事件過濾器是Qt中一個獨特的事件處理機制, 功能強大而且使用起來靈活方便。通過事件過濾器, 可以讓一個物件偵聽攔截另外一個物件的事件。事件過濾器實現如下: 在所有Qt物件的基類QObject中有一個型別為QObjectList的成員變數,名字為

淺議Qt事件處理機制 一

    深入瞭解事件處理系統對於每個學習Qt人來說非常重要,可以說,Qt是以事件驅動的UI工具集。 大家熟知Signals/Slots在多執行緒的實現也依賴於Qt的事件處理機制。     在Qt中,事件被封裝成一個個物件,所有的事件均繼承自抽象類QEvent.  接下來

Qt Quick 事件處理之捏拉縮放與旋轉

    上一篇《Qt Quick事件處理之滑鼠、鍵盤、定時器》我們介紹了常見的滑鼠、鍵盤、定時器的處理,滑鼠、鍵盤都是電腦上我們最常使用的事件,這節我們來介紹 Android 智慧手機上的一個非常重要的