Qt 基礎組件速學 事件過濾器

學習目標:理解事件過濾器

前置環境

運行環境:qt?creator 4.12

學習內容和效果演示:

Qt 提供了事件過濾器的機制,允許我們在事件到達目標對象之前對事件進行攔截和處理。這在以下情況下非常有用:

  1. 全局事件處理: 我們可以在應用程序級別安裝一個事件過濾器,攔截所有控件的事件,實現全局性的事件處理邏輯。

  2. 事件委托: 我們可以讓某個對象代理其他對象的事件處理,比如父窗口處理子控件的事件。

  3. 事件轉發: 我們可以將事件轉發給其他對象處理,比如將鼠標事件轉發給子控件處理。

理解總結:在對象和事件增加中間層,實現對象和事件是n:1的形式

使用事件過濾器的步驟如下:

  1. 創建一個事件過濾器對象,實現?bool eventFilter(QObject*, QEvent*)?函數。該函數用于處理被過濾的事件。

  2. 在需要過濾事件的對象上安裝事件過濾器,使用?installEventFilter()?函數。

  3. 在事件過濾器的?eventFilter()?函數中處理事件,并返回?true?表示事件已經被處理,否則返回?false?讓事件繼續傳播。

實驗

想要實現下列效果,正常思路是給這三個img分別寫對應的鼠標事件,功能效果幾乎一樣。

為了代碼簡化,我想讓這三個img的事件都面向一個事件,則可使用中間層 事件過濾器。

?

?詳細主要代碼

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{img1.load("C:/Users/jbj/Pictures/test/a.jpg");img2.load("C:/Users/jbj/Pictures/test/b.jpg");img3.load("C:/Users/jbj/Pictures/test/c.jpg");jpg1 =new QLabel;jpg2 =new QLabel;jpg3 =new QLabel;jpg1->setAlignment(Qt::AlignCenter);jpg1->setPixmap(QPixmap::fromImage(img1));jpg2->setAlignment(Qt::AlignCenter);jpg2->setPixmap(QPixmap::fromImage(img2));jpg3->setAlignment(Qt::AlignCenter);jpg3->setPixmap(QPixmap::fromImage(img3));QHBoxLayout* h=new QHBoxLayout;h->addWidget(jpg1);h->addWidget(jpg2);h->addWidget(jpg3);QWidget *wgt=new QWidget(this);QVBoxLayout* v= new QVBoxLayout(wgt);v->addLayout(h);status =new QLabel("鼠標按鍵提示信息!");status->setAlignment(Qt::AlignCenter);v->addWidget(status);setCentralWidget(wgt);//中心控件setGeometry(200,200,600,300);// 安裝事件過濾jpg1->installEventFilter(this);jpg2->installEventFilter(this);jpg3->installEventFilter(this);}MainWindow::~MainWindow()
{
}
/** 這個函數是 QObject 類的一個虛函數,需要在自定義的事件過濾器類中進行重寫。* 它接受兩個參數:
QObject* obj: 事件發生的目標對象。QEvent* event: 正在被處理的事件對象。
函數返回值:
如果事件過濾器處理了這個事件,返回 true。
如果事件過濾器沒有處理這個事件,返回 false。這樣事件就會繼續傳播給目標對象。
*/
bool MainWindow::eventFilter(QObject* watch,QEvent*e)   {if (watch  == jpg1){if(e->type() == QEvent::MouseButtonPress){// 鼠標移動區域事件,發生在窗戶區域QMouseEvent *m =(QMouseEvent*)e;if(m->buttons() & Qt::LeftButton) status->setText("鼠標左鍵被按下:[左邊圖片]");if(m->buttons() & Qt::MidButton) status->setText("鼠標中鍵被按下:[左邊圖片]");if(m->buttons() & Qt::RightButton) status->setText("鼠標右鍵被按下:[左邊圖片]");//對當前圖片進行放大2倍 創建了一個 QMatrix 對象,用于存儲圖像變換矩陣。QMatrix matrix;matrix.scale(2,2);QImage img =img1.transformed(matrix);jpg1->setPixmap(QPixmap::fromImage(img));}if(e->type()== QEvent::MouseButtonRelease)//鼠標松開事件{status->setText("鼠標按鍵已經釋放:[左邊圖片]");jpg1->setPixmap(QPixmap::fromImage(img1));}}if (watch  == jpg2){if(e->type() == QEvent::MouseButtonPress){// 鼠標移動區域事件,發生在窗戶區域QMouseEvent *m =(QMouseEvent*)e;if(m->buttons() & Qt::LeftButton) status->setText("鼠標左鍵被按下:[中間圖片]");if(m->buttons() & Qt::MidButton) status->setText("鼠標中鍵被按下:[中間圖片]");if(m->buttons() & Qt::RightButton) status->setText("鼠標右鍵被按下:[中間圖片]");//對當前圖片進行放大2倍QMatrix matrix;matrix.scale(2,2);jpg2->setPixmap(QPixmap::fromImage(img2.transformed(matrix)));}if(e->type()== QEvent::MouseButtonRelease)//鼠標松開事件{status->setText("鼠標按鍵已經釋放:[中間圖片]");jpg2->setPixmap(QPixmap::fromImage(img2));}}if (watch  == jpg3){if(e->type() == QEvent::MouseButtonPress){// 鼠標移動區域事件,發生在窗戶區域QMouseEvent *m =(QMouseEvent*)e;if(m->buttons() & Qt::LeftButton) status->setText("鼠標左鍵被按下:[右邊圖片]");if(m->buttons() & Qt::MidButton) status->setText("鼠標中鍵被按下:[右邊圖片]");if(m->buttons() & Qt::RightButton) status->setText("鼠標右鍵被按下:[右邊圖片]");//對當前圖片進行放大2倍QMatrix matrix;matrix.scale(2,2);jpg3->setPixmap(QPixmap::fromImage(img3.transformed(matrix)));}if(e->type()== QEvent::MouseButtonRelease)//鼠標松開事件{status->setText("鼠標按鍵已經釋放:[右邊圖片]");jpg3->setPixmap(QPixmap::fromImage(img3));}}return QMainWindow::eventFilter(watch,e);
}

總結:

Qt 事件過濾器的主要特點和使用場景:

  1. 事件攔截和處理:

    • 事件過濾器允許我們在事件到達目標對象之前對事件進行攔截和處理。
    • 我們可以在?eventFilter()?函數中檢查和處理各種類型的事件,如鼠標事件、鍵盤事件、paint 事件等。
  2. 自定義事件處理邏輯:

    • 通過事件過濾器,我們可以實現各種自定義的事件處理邏輯,如全局性的事件處理、事件委托和事件轉發等。
    • 這在需要跨控件或跨對象進行事件處理時非常有用。
  3. 安裝和使用:

    • 我們需要創建一個自定義的事件過濾器類,并實現?eventFilter()?函數。
    • 然后在需要過濾事件的對象上安裝事件過濾器,使用?installEventFilter()?函數。
  4. 常見使用場景:

    • 全局事件處理: 在應用程序級別安裝事件過濾器,攔截所有控件的事件,實現全局性的事件處理邏輯。
    • 事件委托: 讓某個對象代理其他對象的事件處理,比如父窗口處理子控件的事件。
    • 事件轉發: 將事件轉發給其他對象處理,比如將鼠標事件轉發給子控件處理。
  5. 返回值含義:

    • 如果事件過濾器處理了這個事件,返回?true
    • 如果事件過濾器沒有處理這個事件,返回?false。這樣事件就會繼續傳播給目標對象。

總之,事件過濾器是 Qt 提供的一個強大的機制,可以幫助我們實現各種復雜的事件處理邏輯。它的核心是?eventFilter()?函數,通過對這個函數的實現,我們可以根據需求靈活地攔截和處理事件。

最后附上源代碼鏈接
對您有幫助的話,幫忙點個star

28-event-fillter · jbjnb/Qt demo - 碼云 - 開源中國 (gitee.com)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41209.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41209.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41209.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

工控人最愛的PLC觸摸屏一體機,有多香

PLC觸摸屏一體機是什么 PLC觸摸屏一體機,聽起來可能有點技術化,但簡單來說,它就是一個集成了可編程邏輯控制器(PLC)和觸摸屏的智能設備。這種設備不僅能夠執行自動化控制任務,還能實時顯示和操作設備狀態&a…

JVM原理(十九):JVM虛擬機內存模型

1. 硬件的效率與一致性 數據不安全的原因:緩存一致性的問題 共享內存多核系統:在多路處理器系統中,每個處理器都有自己的高速緩存,而他們又共享同一主內存。 線程先后執行結果不一致問題:除了增加高速緩存之外&#…

【Python】已解決:nltk.download(‘stopwords‘) 報錯問題

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決:nltk.download(‘stopwords’) 報錯問題 一、分析問題背景 在使用Python的自然語言處理庫NLTK(Natural Language Toolkit)時&#xff0c…

后端開發常見錯誤

1、解析json字符串要考慮格式不正確,空值情況 2、解析時間字符串要考虎格式和空值 3、使用mybatis的foreach的時候要考慮拼接sql的耗時,尤其是超過10條數據 4、表字段長度,在接口層校驗字段長度, 調用三方系統的報錯要截取報錯…

CentOS 7安裝Elasticsearch7.7.0和Kibana

一. 準備安裝包 elasticsearch和kibana:官網歷史版本找到并下載(https://www.elastic.co/cn/downloads/past-releases#elasticsearch)ik分詞器:GitHub下載(https://github.com/infinilabs/analysis-ik/releases/tag/v…

【大模型】衡量巨獸:解讀評估LLM性能的關鍵技術指標

衡量巨獸:解讀評估LLM性能的關鍵技術指標 引言一、困惑度:語言模型的試金石1.1 定義與原理1.2 計算公式1.3 應用與意義 二、BLEU 分數:翻譯質量的標尺2.1 定義與原理2.2 計算方法2.3 應用與意義 三、其他評估指標:綜合考量下的多元…

設計模式之狀態機模式

一、狀態機模式介紹 狀態機模式(State Machine Pattern)是一種用于描述對象行為的軟件設計模式,屬于行為型設計模式。在狀態機模式中,對象的行為取決于其內部狀態,并且在不同的狀態下,對象可能會有不同的行…

STM32F103C8T6核心板原理圖和PCB分享

PCB圖 原理圖 資料下載地址: 原理圖PCB庫: https://545c.com/d/45573183-61875742-29897c?p7526 (訪問密碼: 7526)

[go-zero] 簡單微服務調用

文章目錄 1.注意事項2.服務劃分及創建2.1 用戶微服務2.2 訂單微服務 3.啟動服務3.1 etcd 服務啟動3.2 微服務啟動3.3 測試訪問 1.注意事項 go-zero微服務的注冊中心默認使用的是Etcd。 本小節將以一個訂單服務調用用戶服務來簡單演示一下,其實訂單服務是api服務&a…

Java 使用sql查詢mongodb

在現代應用開發中,關系型數據庫和NoSQL數據庫各有千秋。MongoDB作為一種流行的NoSQL數據庫,以其靈活的文檔模型和強大的擴展能力,受到廣泛歡迎。然而,有時開發者可能更熟悉SQL查詢語法,或者需要在現有系統中復用SQL查詢…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超優先級中斷詳細介紹】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 Interrupt superpriority超優先級中斷的特性和應用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

進程控制-wait和waitpid進程回收

wait 阻塞函數 函數作用: 1. 阻塞并等待子進程退出 2. 回收子進程殘留資源 3. 獲取子進程結束狀態(退出原因) pid_t wait(int *wstatus); 返回值: ‐1 : 回收失敗,已經沒有子進程了 >0 : 回收子進程對應的…

一種非凸全變差正則化的信號降噪方法(以模擬信號和軸承振動信號為例,MATLAB)

以旋轉機械振動信號為例,由于旋轉機械運行中背景噪聲較強,振動信號需要進行降噪處理。常用的小波閾值降噪會在信號的不連續處產生虛假的波峰和偽吉布森震蕩,而奇異值分解SVD去噪容易產生虛假分量,全變差去噪則不會出現這樣的情況&…

美國大選特色

美國總統是間接民選的。選民不直接投票選舉總統,而是通過選舉一個稱為選舉人團(Electoral College)的機構成員來間接決定總統。具體過程如下: 1. **選民投票**:在11月的大選日,選民投票選舉他們所在州的選…

深入理解JS逆向代理與環境監測

博客文章:深入理解JS逆向代理與環境監測 1. 引言 首先要明確JavaScript(JS)在真實網頁瀏覽器環境和Node.js環境中有很多使用特性的區別。尤其是在環境監測和對象原型鏈的檢測方面。本文將探討如何使用JS的代理(Proxy&#xff09…

MySQL之備份與恢復(九)

備份與恢復 從備份中恢復 更高級的恢復技術 復制和基于時間點的恢復使用的是相同的技術:服務器的二進制日志。這意味著復制在恢復時會是個非常有幫助的工具,哪怕方式不是很明顯。下面將演示一些可以用到的方法。這里列出來的不是一個完整的列表,但應該…

STM32-USART

本內容基于江協科技STM32視頻學習之后整理而得。 文章目錄 1. 串口通信協議1.1 通信接口1.2 串口通信1.3 硬件電路1.4 電平標準1.5 串口參數及時序1.6 串口時序 2. USART串口通信2.1 USART簡介2.2 USART框圖2.3 USART基本結構2.4 數據幀2.5 數據幀-配置停止位2.6 起始位偵測2.…

DP學習——簡單工廠模式

學而時習之,溫故而知新。 敵人出招(使用場景) 不同的業務場景下要創建不同的對象,但是這些對象又有共同的特點。如何復用代碼呢?你會想到,這些對象可以抽象出一個基類/抽象類就行了,那么隨著業…

【Python】一文向您詳細介紹 argparse中 action=‘store_true’ 的作用

【Python】一文向您詳細介紹 argparse中 action‘store_true’ 的作用 下滑即可查看博客內容 🌈 歡迎蒞臨我的個人主頁 👈這里是我靜心耕耘深度學習領域、真誠分享知識與智慧的小天地!🎇 🎓 博主簡介:98…

pdf怎么轉換成圖片格式文件,pdf文檔怎么轉換成圖片格式

在數字化時代,pdf文件轉換成圖片格式是一種常見的操作,無論是在工作還是日常生活中,我們總會遇到需要將pdf文件轉換為圖片的需求。這可能是因為圖片格式更易于分享、展示或編輯。那么,如何高效地將pdf轉換成圖片呢?本文…