學習C++、QT---33(QT庫中如何使用事件過濾器實現我們的放大縮小字體功能)

🌟 嗨,我是熱愛嵌入式的濤濤同學!

每日一言

????????別害怕改變,走出舒適圈才能遇見更好的自己。

實現完這個之后我們來接觸一下事件過濾器來實現這個功能吧

好的那么我們的這個事件過濾器的這個函數在QObject類里面

這邊也有相對應的代碼案例進行參考

動手直接上代碼

bool?Widget::eventFilter(QObject?*watched,?QEvent?*event)

{

????if(event->type()==QEvent::Wheel){

????????if(QGuiApplication::keyboardModifiers()==Qt::ControlModifier){

???????????????QWheelEvent?*?wheelEvent=(QWheelEvent?*)event;

???????????????if(wheelEvent->angleDelta().y()>0){

???????????????????zoomIn();

???????????????}else{

???????????????????reduce();

???????????????}

???????????????return?true;

????????}

????????return?false;

????}

}

事件過濾器也就是提前處理了,事件會經過 ?事件產生、事件派發、事件過濾、事件分發、事件處理,

那么我們事件呢就是可以直接在事件過濾器這邊實現,那么我們會發現要是我這邊寫兩個事件,一個是滾輪事件、一個是鍵盤按下事件,那么會發現無法將他們聯系在一起啊,也就是事件過濾器在同一時間只能過濾一個事件,所以我們這邊需要將滾輪事件和我們的和我們的ctrl進行綁定,那么我們該怎么辦呢,那么我們的ctrl也就是按下按鍵的這個操作不能寫成事件,

那么我們該怎么寫呢??

那么我們這邊提供一個新的用法就是QGuiAppLication::keyboradModifiers()這個函數就是檢測按鍵的狀態的,

這邊我需要講解一下

函數作用詳解

QGuiApplication::keyboardModifiers()?是一個獲取當前鍵盤修飾鍵狀態的全局函數,核心作用是:
返回當前被按下的修飾鍵(如 Ctrl、Shift、Alt 等),常用于判斷用戶是否按下了組合鍵(如 Ctrl + 滾輪、Shift + 點擊等)。

關鍵細節解析

返回值類型Qt::KeyboardModifiers
這是一個枚舉類型,可能的返回值包括:

    1. Qt::NoModifier:無修飾鍵被按下。
    2. Qt::ControlModifier:Ctrl 鍵被按下。
    3. Qt::ShiftModifier:Shift 鍵被按下。
    4. Qt::AltModifier:Alt 鍵被按下。
    5. 組合值(如?Qt::ControlModifier | Qt::ShiftModifier?表示 Ctrl+Shift 同時按下)。

“當前狀態” 的含義
函數返回的是事件隊列中最近一次更新的修飾鍵狀態(基于最近的?KeyPress?或?KeyRelease?事件),而非 “實時硬件狀態”。

    1. 例如:當你按下 Ctrl 鍵,Qt 會發送?KeyPress?事件,keyboardModifiers()?會更新為?Qt::ControlModifier
    2. 當你釋放 Ctrl 鍵,Qt 發送?KeyRelease?事件,狀態會重置為?Qt::NoModifier

適用場景
用于判斷組合鍵操作,例如:

    1. Ctrl + 滾輪縮放(你的代碼中已使用)。
    2. Ctrl+C 復制、Ctrl+V 粘貼等快捷鍵。
    3. Shift + 點擊多選等交互邏輯。

??QWheelEvent?*?wheelEvent=(QWheelEvent?*)event;這句話是因為我們需要轉換一下,因為原本的我們的event是QEvent類型的那樣的話怎么去獲得我們的滾輪的詳細信息呢,那么我們就需要進行轉換,我們這樣的屬于是c語言的轉換方式,也可以用哈,但是還有幾種c++的專門的轉換方法

轉換完之后我們就可以依據這個滾輪中的angleDelta這個函數進行判斷,如果大于0就放大,小于0就縮小

會發現,那我們是不是還需要加上return true 啊

bool?Widget::eventFilter(QObject?*watched,?QEvent?*event)

{

????if(event->type()==QEvent::Wheel){

????????if(QGuiApplication::keyboardModifiers()==Qt::ControlModifier){

???????????????QWheelEvent?*?wheelEvent=(QWheelEvent?*)event;

???????????????if(wheelEvent->angleDelta().y()>0){

???????????????????zoomIn();

???????????????}else{

???????????????????reduce();

???????????????}

???????????????return?true;

????????}

????????return?false;

????}

}

總結

轉換的目的是:將通用的事件基類指針,轉換為具體的事件子類指針,從而訪問該事件特有的屬性和方法

會發現我們沒有用到這個watched,

總結

你的代碼中?watched?未被使用,說明這個過濾器是 **“通用型”** 的(對所有被監聽控件生效)。如果未來需要限制縮放功能只對特定控件生效(比如只讓文本框縮放,按鈕不縮放),就需要通過?watched?來判斷對象類型或名稱,實現更精確的控制。

這正是?watched?參數的意義:讓事件過濾器可以根據事件來源靈活處理不同控件的事件。

Tips:eventFilter()?函數本身是?QObject?類的虛函數(默認實現為空),需要我們在自定義類中重寫它,并通過?installEventFilter()?將其安裝到目標對象上,才能生效。

1. 事件過濾器的工作流程

默認狀態
所有?QObject?子類都有?eventFilter()?函數,但默認實現為空(直接返回?false),不會攔截任何事件。

重寫并安裝
我們需要在自定義類(如?Widget)中重寫?eventFilter(),并通過?target->installEventFilter(this)?將其安裝到目標對象(target)上。

事件分發
當?target?接收到事件時,Qt 會先調用其安裝的事件過濾器,再將事件傳遞給?target?自身的事件處理函數。

好的那么我們的記事本項目就完結了,認真學下來會發現學會了很多,從剛開始的懵懵懂懂,到后面會發現我們對Qt手冊更會使用了,也就是我們學習QT也就是轉換為學習怎么使用QT手冊了,因為QT的類有上萬個,我們不可能學的完,但是常用的類有幾十個,所以我們就是要記住我們現在所學的任何一個類和其中的函數,知道怎么尋找,這個就是我們學QT的得出的經驗。

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

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

相關文章

[每日隨題15] 前綴和 - 拓撲排序 - 樹狀數組

整體概述 難度:1000 →\rightarrow→ 1500 →\rightarrow→ 2000 1567B. MEXor Mixup 標簽:前綴和 前置知識:無 難度:Div.2.B 1000 題目描述: 輸入格式: 輸出格式: 樣例輸入: …

DDD領域驅動設計C++實現案例:訂單管理系統

一、DDD核心概念簡介 領域驅動設計(Domain-Driven Design)是一種軟件開發方法論,強調將業務領域的概念和規則融入軟件設計中。核心概念包括: 值對象(Value Object): 無唯一標識,基于屬性值判斷相等性實體(Entity): 有唯一標識,其生…

神經網絡和機器學習的一些基本概念

記錄一些基本概念,不涉及公式推導,因為數學不好,記了也沒啥用,但是知道一些基本術語以及其中的關系,對神經網絡訓練有很大幫助。 可能有些概念不會講得很詳細,但是當你有了這個概念,你就知道往這個方向去獲取更詳細的信息,不至于連往哪走都不知道。 下面以多元線性回歸…

MySQL(146) 如何遷移數據庫到新服務器?

數據庫遷移到新服務器是一項復雜而重要的任務,確保數據完整性和最小化停機時間至關重要。以下是一個詳細的步驟指導,包括準備工作、數據備份、數據傳輸、數據恢復和驗證的全過程。 一、準備工作 1. 確認服務器環境 源服務器:當前運行數據庫的…

圖論的整合

圖 有若干個節點,有若干條邊連接節點。(兩個點之間不是必須相連) 比如: 有向圖 可以理解為邊上面有箭頭的圖,比如下面這張圖: 在這張圖中,點 111 可以通過這條有向邊到達點 222&#xff0c…

電子設計大賽【C語言核心知識點】講解

目錄 前言 1. 基礎語法 2. 流程控制 3. 函數 4. 數組與字符串 5. 指針(核心重點) 6. 內存管理 7. 結構體與聯合體 8. 文件操作 9. 預處理器 10. 高級特性 內存布局圖解 前言 在進行程序代碼開發之前,需要掌握好C語言各個模塊之間…

Numpy 庫 矩陣數學運算,點積,文件讀取和保存等

目錄 1.數組(矩陣)的組合 2.數組(矩陣)的切割 3.數組的數學運算 4.數組的深拷貝和淺拷貝 5.隨機模塊 6.矩陣統計運算 7.矩陣的特有運算點積,求逆 8.文件讀取和保存 1.數組(矩陣)的組合 水…

STL學習(?函數對象,謂詞,內建函數對象)

目錄 一、函數對象 1.函數對象的概念 2.函數對象的使用 (1)函數對象在使用的時候,可以像普通函數那樣調用,可以有參數,也可以有返回值。 (2)函數對象超出普通函數的概念,函數對象…

【爬蟲】05 - 爬蟲攻防

爬蟲05 - 爬蟲攻防 文章目錄爬蟲05 - 爬蟲攻防一:隨機User-Agent爬蟲1:fake-useragent2:高級反反爬策略3:生產環境建議二:代理IP爬蟲1:獲取代理IP2:高階攻防3:企業級的代理實戰三&am…

FPGA自學——存儲器模型

FPGA自學——存儲器模型 文章目錄FPGA自學——存儲器模型一、IP核二、ROM(read only memory)三、ROM的IP核調用四、RAM(random access memory)五、RAM的IP核調用總結1.不同波形的使用的存儲器2.塊與分布式的選擇3.FPGA與模塊的容量…

【C++】stack和queue拓展學習

目錄 1.反向迭代器思路及實現 1.1. 源碼及框架分析 1.2. 實現反向迭代器 2.stack和queue練習拓展-計算器實現 2.1. 后綴表達式概念 2.2. 后綴表達式運算規則 2.3. 中綴表達式轉后綴表達式 2.3.1 轉換思路 2.3.2 代碼實現 2.4. 計算器實現 1.反向迭代器思路及實現 1.1…

Web3與區塊鏈如何革新網絡安全——走在前沿

隨著互聯網技術的飛速發展,網絡安全問題日益成為全球關注的焦點。Web3和區塊鏈技術作為新興的技術力量,正在逐步改變網絡安全的格局。本文將探討Web3和區塊鏈技術如何革新網絡安全,走在技術前沿。 1. Web3技術概述 Web3,即第三代互…

網絡初級安全第三次作業

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用戶登錄</title><style>* {margin:…

CSS中用display實現元素的顯示/隱藏切換

** 通過display中的none和block ** 在前端開發中&#xff0c;display: none 和 display: block 是兩種常用的 CSS 顯示模式&#xff0c;核心區別在于&#xff1a;是否在頁面中保留元素的占位空間 1. 核心區別屬性display: nonedisplay: block占位空間元素完全從渲染樹中移除&am…

因果圖方法設計測試用例的價值與使用范圍

一、因果圖方法的核心原理 因果圖方法通過分析軟件規格說明中的輸入條件&#xff08;因&#xff09;和輸出結果&#xff08;果&#xff09;之間的邏輯關系&#xff0c;利用圖形化方式將這些關系清晰展現。它使用特定的符號表示因果關系&#xff08;如恒等、非、或、與&#xff…

智慧農服數字化平臺-數字科技賦能農業,開啟智慧三農新篇章

智慧農服數字化平臺數字科技賦能農業&#xff0c;開啟智慧三農新篇章平臺概覽在鄉村振興和農業現代化的時代背景下&#xff0c;我們推出了創新的農業服務數字化平臺——一個專為農業生產者打造的綜合性SaaS服務平臺。平臺以"科技助農、數據興農"為使命&#xff0c;通…

在線教育培訓課程視頻如何防下載、防盜錄?

在數字化學習日益普及的今天&#xff0c;高質量的在線課程已成為教育機構、知識付費平臺和講師的核心競爭力。如何在不影響學員正常學習體驗的前提下&#xff0c;有效防止課程視頻被惡意盜取&#xff1f;今天介紹在線教育課程防下載、防盜錄的10種視頻加密方法&#xff0c;看看…

圖像分析學習筆記(2):圖像處理基礎

圖像分析學習筆記&#xff1a;圖像處理基礎圖像增強方法圖像復原方法圖像分割方法形態學處理圖像增強方法 目的&#xff1a;改善視覺效果&#xff0c;例如增強對比度定義&#xff1a;為了改善視覺效果、便于人或計算機對圖像的分析理解&#xff0c;針對圖像的特點或存在的問題…

生存分析機器學習問題

研究目標&#xff1a; 開發一個機器學習模型&#xff0c;用于個性化預測XXX的總體生存期。 模型輸入&#xff1a;結合生存時間、治療方案、人口統計學特征和實驗室測試結果等多種特征。 模型輸出&#xff1a;預測二元結果&#xff08;活著 vs. 死亡&#xff09;。 應用場景&…

【華為機試】547. 省份數量

文章目錄547. 省份數量描述示例 1示例 2提示解題思路核心分析問題轉化算法選擇策略1. 深度優先搜索 (DFS)2. 廣度優先搜索 (BFS)3. 并查集 (Union-Find)算法實現詳解方法一&#xff1a;深度優先搜索 (DFS)方法二&#xff1a;廣度優先搜索 (BFS)方法三&#xff1a;并查集 (Union…