【Qt開發】信號與槽(一)

目錄

1 -> 信號和槽概述

1.1 -> 信號的本質

1.2 -> 槽的本質

2 -> 信號與槽的連接方式

2.1 -> 一對一

2.2 -> 一對多

2.3 -> 多對一

3 -> 小結


1 -> 信號和槽概述

在 Qt 中,用戶和控件的每次交互過程稱為一個事件。比如 “用戶點擊按鈕” 是一個事件,“用戶關閉窗口也是一個事件”。,每個事件都會發出一個信號,例如用戶點擊按鈕會發出 “按鈕被點擊” 的信號,用戶關閉窗口會發出 “窗口被關閉” 的信號。

Qt 中的所有控件都具有接收信號的能力,一個控件還可以接收多個不同的信號。對于接收到的每個信號,控件都會做出相應的響應動作。例如,按鈕所在的窗口接收到 “按鈕被點擊” 的信號后,會做出“關閉自己”的相應動作;再比如輸入框自己接收到 “輸入框被點擊” 的信號后,會做出 “顯示閃爍的光標,等待用戶輸入數據” 的響應動作。在 Qt 中,對信號做出的響應動作就稱之為槽。

信號和槽是 Qt 特有的消息傳輸機制,它能將互相獨立的控件關聯起來、比如,“按鈕” 和 “窗口” 本身是兩個獨立的控件,點擊 “按鈕” 并不會對 “窗口” 造成任何影響。通過信號和槽機制,可以將 “按鈕” 和 “窗口” 關聯起來,實現 “點擊按鈕會使窗口關閉” 的效果。

1.1 -> 信號的本質

信號是由于用戶對窗口或控件進行了某些操作,導致窗口或控件產生了某個特定事件,這時 Qt 對應的窗口類會發出某個信號,以此對用戶的操作做出反應。因此,信號的本質就是事件。如:

  • 按鈕單擊、雙擊
  • 窗口刷新
  • 鼠標移動、鼠標按下、鼠標釋放
  • 鍵盤輸入

那么問題來了,在 Qt 中信號是通過什么形式呈現給使用者呢?

  • 我們對哪個窗口進行操作,哪個窗口就可以捕捉到這些被觸發的事件
  • 對于使用者來說,觸發了一個事件我們就可以得到 Qt 框架給我們發出的某個特定信號
  • 信號的呈現形式就是函數,也就是說某個事件產生了,Qt 框架就會調用某個對應的信號函數,通知使用者。

在 Qt 中信號的發出者是某個實例化的類對象。

1.2 -> 槽的本質

?槽(Slot)就是對信號響應的函數。槽就是一個函數,與一般的 C++ 函數是一樣的,可以定義在類的任何位置(public、protected 或 private),可以具有任何參數,可以被重載,也可以被直接調用(但是不能有默認參數)。槽函數與一般的函數不同的是:槽函數可以與一個信號關聯,當信號被發射時,關聯的槽函數被自動執行。

說明

  1. 信號和槽機制底層是通過函數間的相互調用實現的。每個信號都可以用函數來表示,稱為信號函數;每個槽也可以用函數表示,稱為槽函數。例如:“按鈕被按下” 這個信號可以用 clicked() 函數表示,“關閉窗口” 這個槽可以用 close() 函數表示,假如使用信號和槽機制實現:“點擊按鈕會關閉窗口” 的功能,其實就是 clicked() 函數調用 close() 函數的效果。
  2. 信號函數和槽函數通常位于某個類中,和普通的成員函數相比,它們的特別之處在于:
    • 信號函數用 signals 關鍵字修飾,槽函數用 public slots、protected slots 或者 private slots 修飾。signals slots 是 Qt 在 C++ 的基礎上擴展的關鍵字,專門用來指明信號函數和槽函數;
    • 信號函數只需要聲明,不需要定義(實現),而槽函數需要定義(實現)。

注意

信號函數的定義是 Qt 自動在編譯程序之前生成的。編寫 Qt 應用程序時無需關注。

這種自動生成代碼的機制稱為 元編程(Meta Programming)。這種操作在很多場景都能見到。

2 -> 信號與槽的連接方式

2.1 -> 一對一

主要有兩種形式,分別是:一個信號連接一個槽 一個信號連接一個信號

一. 一個信號連接一個槽

示例:

1. 在 “widget.h” 中聲明信號和槽以及信號發射函數。

?2. 在 “widget.cpp” 中實現槽函數,信號發射函數以及連接信號和槽。

二. 一個信號連接另一個信號

示例:

在上述示例基礎上,在 “widget.cpp” 文件中添加如下代碼:

2.2 -> 一對多

一個信號連接多個槽

示例:

1. 在 “widget.h” 頭文件中聲明一個信號三個槽。?

2. 在 “widget.cpp” 文件中實現槽函數以及連接信號和槽。

2.3 -> 多對一

多個信號連接一個槽函數

示例:

1. 在 “widget.h” 頭文件中聲明兩個信號以及一個槽

2. 在 “widget.cpp” 文件中實現槽函數以及連接信號和槽。

3 -> 小結

一、核心概念

  1. 信號本質:用戶操作控件產生的事件(如點擊按鈕、關閉窗口)觸發Qt框架自動調用的信號函數,是事件在代碼層的表現形式

  2. 槽本質:響應信號的成員函數,具有普通函數特性(可重載、帶參數),但需用slots關鍵字修飾

  3. 核心機制:通過信號函數調用槽函數實現對象間解耦通信(如點擊按鈕觸發窗口關閉)

二、連接方式

  1. 一對一連接

    • 信號→槽:基礎連接(如按鈕點擊觸發處理函數)

    • 信號→信號:實現信號級聯傳遞(如按鈕A點擊觸發按鈕B的信號)

  2. 一對多連接

    • 單信號→多槽:信號觸發時多個槽函數按連接順序執行

  3. 多對一連接

    • 多信號→單槽:不同信號觸發同一處理邏輯(如多個按鈕共用響應函數)

三、關鍵特性

  • 信號只需聲明(Qt自動生成實現),槽需完整定義

  • 通過QObject::connect()建立連接關系

  • 支持靈活的事件響應鏈設計(信號級聯、多路響應)

  • 實現控件間解耦交互(如按鈕與窗口獨立對象通過信號槽關聯)

四、核心價值
提供安全的事件驅動通信框架,使GUI組件能獨立開發并通過信號槽動態組合功能,大幅提升Qt應用的模塊化程度和可維護性。


感謝各位大佬支持!!!

互三啦!!!

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

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

相關文章

目標檢測中的標簽分配算法總結

目標檢測中的標簽分配算法是訓練過程中的一個核心環節,它決定了如何將標注好的真實目標框分配給模型預測出來的候選框(Anchor Boxes或Points),從而為這些候選框提供監督信號(正樣本、負樣本、忽略樣本)。它…

圖片轉 PDF三個免費方法總結

📌 為什么需要圖片轉 PDF? 在工作和生活中,我們經常需要將多張圖片整理成 PDF 文檔,例如:工作資料歸檔, 學習筆記整理,作品集展示,便捷分享。 方法一、iLoveOFD在線工具 提供圖片…

Kafka 在分布式系統中的關鍵特性與機制深度解析

在分布式系統架構中,消息中間件扮演著 "數據樞紐" 的核心角色,而 Kafka 憑借其卓越的性能和可靠性,成為眾多企業的首選。本文將深入剖析 Kafka 在分布式環境中的核心特性與底層機制,揭示其高吞吐、高可用的底層邏輯。一…

Python實戰:基于Streamlit的股票篩選系統,實時K線圖+數據緩存優化

基于 Streamlit 構建的股票篩選分析工具,整合了 Tushare 接口獲取股票數據,并通過交互式界面實現股票篩選、信息展示和 K 線圖分析。以下是深度解讀:一、代碼結構概覽依賴庫導入import streamlit as st import tushare as ts import pandas a…

網絡安全威脅和防御措施

網絡安全基礎概念網絡安全指保護網絡系統及其數據免受未經授權的訪問、破壞或泄露。涵蓋硬件、軟件、數據及服務的安全防護,涉及技術、管理和法律等多層面措施。常見網絡安全威脅惡意軟件:病毒、蠕蟲、勒索軟件等通過漏洞感染系統。網絡釣魚:…

Spring DeferredResult 實現長輪詢

1、背景 在項目開發中,有一個流程性的方法執行,這個方法會調用各種方法,可能會導致時間比較長 ,如果一直等待響應結果的話,可能會造成超時,如果直接使用異步的方式的話,前端無法知道整體流程什…

Python設計模式 - 橋接模式

定義 橋接模式是一種結構型設計模式,它的核心思想是將抽象部分與實現部分分離,使它們可以獨立變化。 結構抽象類(Abstraction):定義抽象接口,持有實現部分的引用。具體抽象類(Refined Abstracti…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 用戶注冊實現

大家好,我是java1234_小鋒老師,最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程,持續更新中,計劃月底更新完,感謝支持。今天講解用戶注冊實現 視頻在線地址: …

華為7月23日機考真題

📌 點擊直達筆試專欄 👉《大廠筆試突圍》 💻 春秋招筆試突圍在線OJ 筆試突圍OJ](bishipass.com) 03. 山峰觀測站數據分析 問題描述 LYA是一名地理數據分析師,負責分析山峰觀測站收集的海拔高度數據。觀測站在一條直線上設置了…

圖像分析學習筆記(4):機器學習圖像特征與描述

圖像分析學習筆記(4):機器學習圖像特征與描述深度學習基礎深度學習技巧深度模型構建深度學習基礎 深度學習概念:深度學習是機器學習的一個分支,它基于一系列算法,試圖通過使用多個處理層建立數據的高級抽象…

鎖付機器人,如何精準鎖附革新新能源鋰電裝配效率

其實呢,隨著科技的不斷發展,新能源電池、智能制造、精密裝配、工藝升級以及工業自動化這些領域都在飛速前進。新能源行業如今可是炙手可熱,中國新能源行業進入快速發展階段,就像一列高速行駛的火車,勢不可擋。在這個過…

Vue項目開發注意事項(包含node/npm/cnpm等)

事項一:項目代碼放在本地怎么運行起來 1、首先確定項目對應的node和npm版本 node下載地址 Index of /dist/https://nodejs.org/dist/ node 與 npm版本對應關系 Node.js — Node.js Releases 2、node卸載的時候,會自動把對應的npm卸載掉 情況1&…

GitHub:只支持 Git 作為唯一的版本庫格式進行托管

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 🍚 藍橋云課簽約作者、…

秋招Day17 - Spring - MVC

Spring MVC有哪些核心組件?DispatcherServlet:前端控制器,所有HTTP請求首先經過它,分發請求到正確的處理器,并與其他組件協調。HandlerMapping:維護URL和處理器的映射關系Handler:處理器&#x…

使用mybatis實現模糊查詢和精準查詢切換的功能

1、首先在前端頁面添加勾選框&#xff08;name設置為check&#xff09;2、mybatis代碼當check勾選時&#xff0c;check不為null&#xff0c;走模糊查詢like當check未勾選時&#xff0c;check為null&#xff0c;走精準查詢 <if test"check ! null and check ! "&g…

Android模塊化實現方案深度分析

模塊化是現代 Android 開發應對項目復雜度激增、團隊協作效率、編譯速度瓶頸、功能復用與動態化等挑戰的核心架構思想。其核心目標是高內聚、低耦合、可插拔、易維護。 一、模塊化的核心價值與目標 降低復雜度&#xff1a; 將龐大單體應用拆分為獨立、職責清晰的模塊。加速編譯…

網絡基礎16--VRRP技術

一、VRRP核心概念定義虛擬路由器冗余協議&#xff08;VRRP&#xff0c;Virtual Router Redundancy Protocol&#xff09;&#xff0c;可以將多個路由器加入到備份組中&#xff0c;形成一臺虛擬路由器&#xff0c;承擔網關功能。RFC 3768標準定義的VRRP是一種容錯協議&#xff0…

最長公共前綴-leetcode

編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 輸入&#xff1a;strs [“flower”,“flow”,“flight”] 輸出&#xff1a;“fl” 示例 2&#xff1a; 輸入&#xff1a;strs [“dog”,“racecar”,…

vs2022:C++安裝opencv

vs2022:C安裝opencv https://opencv.org/releases/ 1.配置包含目錄 2.配置庫目錄 3.配置連接器 4.配置環境變量 5.重新啟動VS2015/VS2017 6.測試 1.配置包含目錄 (頭文件) 2.配置庫目錄&#xff08;dll存放的庫目錄&#xff09; 3.配置連接器(庫) 4.配置環境變量 5.重新啟動VS…

智聯智造:國內新能源汽車品牌AGV小車無線控制系統創新實踐

行業背景&#xff1a;智能制造浪潮下的通信剛需 在全球制造業智能化轉型浪潮中&#xff0c;工業4.0技術已成為提升生產效率與產品質量的核心驅動力。國內某新能源汽車品牌作為智能制造的標桿企業&#xff0c;積極投身自動化設備與智能生產系統的革新。其中&#xff0c;無線控制…