初識Qt · 信號與槽 · 基礎知識

目錄

前言:

信號和槽初識

兩個問題


前言:

本文我們正式開始介紹信號與槽這個概念,在談及Qt中的信號與槽這個概念之前,我們不妨回顧一下Linux中的信號,比如發生了除0錯誤,OS就會給該進程發送一個信號,使該進程終止。

那么Linux中涉及信號的時候,涉及到了誰發出的,什么信號,執行的行為,誰接受的。在我們前文熟悉Qt的整個框架的時候,使用的函數connect,參數分別就是上面涉及到了四個點,所以實際上Qt中的信號和Linux中的信號是有很多相同點的,那么有了Linux的基礎,在這里學習Qt我們就要輕松很多了。


信號和槽初識

說到底,我們現在還是沒有理解什么是槽,什么是信號,這里先給一個結論:

信號和槽都是函數

但是,為什么信號是函數這里并不打算展開來說,我們在這里能理解的是槽是函數,那么也就是說,某個控件接收到了某個信號,就要執行對應的槽函數,那么我們為什么控件知道接收到了某個信號就應該執行某個槽函數呢?

這是因為connect將槽函數和信號關聯在了一起。

那么槽和信號的觸發順序是什么呢?我們不妨舉個女朋友在一個月中總有那么不舒服的幾天,當我們接收到了女朋友不舒服的這個信號,我們就應該知道我們該倒紅糖水,該揉揉肚子什么的。

所以對于信號和槽的一個處理順序來看,我們就應該知道,在信號處理之前,我們一定要有槽函數的這個定義,如果沒有定義,我們就錯過了這個信號的處理,自然而言的,女朋友的”蜀道難“也就來了。

那么我們回到Qt就知道,connect函數實際上是一個回調函數,信號是函數吧?槽是函數吧?那么這兩個函數作為了connect函數的參數,也就成就了一個典型回調函數。

那么既然介紹到了connect,對于參數部分我們就不用提及了,對于C++中的庫函數我們都是知道來源于誰的,那么connect函數是來源于誰呢?

牽扯到了這個問題,我們就不得不談一談Qt中的一個繼承關系,拿隔壁java舉例,我們知道java的所有類都繼承于一個專門的類,叫做Object,在Qt中也有一個類似的設定,即QObject是所有內置類的祖宗:

那么connect函數呢就是QObject中的一個靜態成員函數。

 //connect to a functor, with a "context" object defining in which event loop is going to be executedtemplate <typename Func1, typename Func2>static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::typeconnect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,Qt::ConnectionType type = Qt::AutoConnection)

這是它的一個函數定義。

對于我們之前看到的connect函數好像又有所不同,我們之前使用的connect函數好像沒有那么復雜,我們之前使用Qt函數的原型是:

可是你看上面的類型,好像無論如何都沒有辦法和char*打上交道,對于第一個和第三個來說多正常,因為這兩個參數是接收控件的嘛,子類賦值給基類,非常正常,可是其他參數呢?

之前使用第二個和第四個的參數可是函數指針類型,和char*是一點沒有關系的,這怎么能夠防在一起?實際上兩個宏有關,一個是給槽函數傳參的時候要搭配一個SLOT宏,一個是給信號函數傳參的時候需要搭配一個SIGNAL宏。這兩個宏可以讓傳入的指針變成char*。所以以前寫的時候,是這樣使用connect函數的:

connect(button,SIGNAL(&QPushButton::clicked),this,SLOT(&Widget::close));

但是這個寫法是Qt4之前的了,對于新版的Qt就不用這樣寫了,實在是麻煩,新版的Qt5支持了一個重載版本,使得第二個和第四個參數變成了泛型指針,我們也就不用宏了,當然你要想那樣寫應該也沒事兒~

這個時候的Qt就有了一個類型檢查的功能,在上文提供的一個源碼來說:

const typename QtPrivate::FunctionPointer<Func1>::Object *sender

這是一個類型萃取器,如果傳入的參數第一個和第二個不匹配,第三個和第四個不匹配,主要指的是函數指針,編譯就會報錯了~當然,這里我們了解一下就行。

現在我們來了解一下信號,我們會發現之前使用button的信號的時候,有兩個click,一個是過去分詞形式,一個是動詞形式:

其中這個鋸齒形狀的就是slot函數,也就是槽函數,比如我觸發了一個信號,然后某個按鈕就click了,對于波紋狀的就是信號函數,是我們點擊了,然后觸發了信號。

這是二者的區別。

對于connect函數來說,第一個和第二個的參數類型應該是匹配的,第一個比如是button,第二個就應該是父類的信號,不能是其他的,比如QLineEdit的。

以上是對connect函數的一個簡單理解。

實際上在以前老版本的時候,實現槽函數應該在前面加:
?

public slot:void Handle();

但是現在不用了~你要想也可以~?


如何查閱

我咋知道QPushButton中有個clicked信號?我咋知道QWidget有個close槽?

也就是我們可以延展到我們怎么翻閱文檔?

直接就是打開一手assistant,從中我們直接在索引部分找QPushButtion,但是我們似乎翻遍了文檔也沒有找到clicked信號。

這其實是因為clicked是繼承于它的父類的,那么我們從哪里進到父類呢?

Inherits是繼承,也就是說該類是繼承于QAbstractButton的,下面的同理,我們點進去看看:

就可以看到它同樣是繼承了別的類的。

往下滑動就可以看到對應的槽函數和信號函數了,那么信號函數的缺省值我們不用管,稍微想想也能相通。

以上是對信號和槽的一個簡單知識輸出。


感謝閱讀!

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

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

相關文章

Kotlin 5種單例模式

在Kotlin中實現單例模式有多種方法&#xff0c;以下是幾種常見的方法&#xff1a; 餓漢式 餓漢式是最簡單的一種實現方式&#xff0c;在類加載時就完成了實例的初始化。 //餓漢式 object Singleton1 {fun printMessage() {println("餓漢式")} }懶漢式 懶漢式是延遲…

探秘基帶算法:從原理到5G時代的通信變革【一】引言

文章目錄 一、引言1.1 研究背景與意義1.2 研究目的與方法1.3 研究內容與創新點 本博客為系列博客&#xff0c;主要講解各基帶算法的原理與應用&#xff0c;包括&#xff1a;viterbi解碼、Turbo編解碼、Polar編解碼、CORDIC算法、CRC校驗、FFT/DFT、QAMtiaozhi/解調、QPSK調制/解…

C/C++輸入輸出(1)

1.getchar和putchar 1.1getchar() 函數原型&#xff1a; 1 int getchar(void); getchar()函數返回用戶從鍵盤輸入的字符&#xff0c;使用時不帶有任何參數。 程序運行到這個命令就會暫停&#xff0c;等待用戶從鍵盤輸入&#xff0c;等同于使用cin或scanf()方法讀取一個字符…

【消息隊列】數據庫的數據管理

1. 數據庫的選擇 對于當前實現消息隊列這樣的一個中間件來說&#xff0c;具體要使用哪個數據庫&#xff0c;是需要稍作考慮的&#xff0c;如果直接使用 MySQL 數據庫也是能實現正常的功能&#xff0c;但是 MySQL 也是一個客戶端服務器程序&#xff0c;也就意味著如果想在其他服…

飛機大戰lua迷你世界腳本

-- 迷你世界飛機大戰 v1.2 -- 星空露珠工作室制作 -- 最后更新&#xff1a;2024年1月 ----------------------------- -- 迷你世界API適配配置 ----------------------------- local UI { BASE_ID 7477478487091949474-22856, -- UI界面ID ELEMENTS { BG 1, -- 背景 BTN_LE…

圖解MOE大模型的7個核心問題并探討DeepSeekMoE的專家機制創新

原文地址:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts #mermaid-svg-FU7YUSIfuXO6EVHa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FU7YUSIfuXO6EVHa .error-icon{fill…

【智能機器人開發全流程:硬件選型、軟件架構與ROS實戰,打造高效機器人系統】

文章目錄 1. 硬件層設計(1) 傳感器選型(2) 計算平臺 2. 軟件架構設計(1) 核心模塊劃分(2) 通信框架 3. 關鍵實現步驟(1) 硬件-軟件接口開發(2) SLAM與導航實現(3) 仿真與測試 4. 典型框架示例基于ROS的移動機器人分層架構 5. 優化與擴展6. 開源項目參考 1. 硬件層設計 (1) 傳感…

React Native v0.78 更新

這個版本在 React Native 中引入了 React 19&#xff0c;并帶來了一些重要的新功能&#xff0c;例如 Android 矢量圖&#xff08;Vector Drawables&#xff09;的原生支持 以及 iOS 更好的 Brownfield 集成。 亮點 React 19 集成更小更快的發布節奏可選擇在 Metro 中啟用 Jav…

機器學習數學通關指南

? 寫在前面 &#x1f4a1; 在代碼的世界里沉浸了十余載&#xff0c;我一直自詡邏輯思維敏捷&#xff0c;編程能力不俗。然而&#xff0c;當我初次接觸 DeepSeek-R1 并領略其清晰、系統的思考過程時&#xff0c;我不禁為之震撼。那一刻&#xff0c;我深刻意識到&#xff1a;在A…

MySQL 實驗1:Windows 環境下 MySQL5.5 安裝與配置

MySQL 實驗1&#xff1a;Windows 環境下 MySQL5.5 安裝與配置 目錄 MySQL 實驗1&#xff1a;Windows 環境下 MySQL5.5 安裝與配置 一、MySQL 軟件的下載二、安裝 MySQL三、配置 MySQL 1、配置環境變量2、安裝并啟動 MySQL 服務3、設置 MySQL 字符集4、為 root 用戶設置登錄密…

煙花燃放安全管控:智能分析網關V4煙火檢測技術保障安全

一、方案背景 在中國諸多傳統節日的繽紛畫卷中&#xff0c;煙花盛放、燒紙祭祀承載著人們的深厚情感。一方面&#xff0c;煙花璀璨&#xff0c;是對節日歡慶氛圍的熱烈烘托&#xff0c;寄托著大家對美好生活的向往與期許&#xff1b;另一方面&#xff0c;裊裊青煙、點點燭光&a…

Elasticsearch:解鎖深度匹配,運用Elasticsearch DSL構建閃電般的高效模糊搜索體驗

目錄 Elasticsearch查詢分類 葉子查詢 全文檢索查詢 match查詢 multi_match查詢 精確查詢 term查詢 range查詢 復雜查詢 bool查詢簡單應用 bool查詢實現排序和分頁 bool查詢實現高亮 場景分析 問題思考 解決方案 search_after方案(推薦) point in time方案 方案…

數據安全VS創作自由:ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南

文章目錄 數據安全VS創作自由&#xff1a;ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南ChatGPTKimi騰訊元寶DeepSeek 數據安全VS創作自由&#xff1a;ChatGPT與國產AI工具隱私管理對比——論文黨程序員必看的避坑指南 產品隱私設置操作路徑隱私協議ChatGPT…

FFmpeg入門:最簡單的音視頻播放器

FFmpeg入門&#xff1a;最簡單的音視頻播放器 前兩章&#xff0c;我們已經了解了分別如何構建一個簡單和音頻播放器和視頻播放器。 FFmpeg入門&#xff1a;最簡單的音頻播放器 FFmpeg入門&#xff1a;最簡單的視頻播放器 本章我們將結合上述兩章的知識&#xff0c;看看如何融…

windows 上刪除 node_modules

在 Windows 11 上&#xff0c;你可以通過命令行來刪除 node_modules 文件夾并清除 npm 緩存。以下是具體步驟&#xff1a; 刪除 node_modules 打開命令提示符&#xff08;Command Prompt&#xff09;或終端&#xff08;PowerShell&#xff09;。 導航到項目目錄。你可以使用 …

kotlin的val聲明的變量是常量嗎

kotlin的val聲明的變量是常量嗎 DeepSeek R1 思考 65 秒 思考過程 嗯&#xff0c;用戶問的是Kotlin中的val聲明的變量是不是常量。首先我需要回憶一下Kotlin的基礎知識。記得在Kotlin里&#xff0c;val用來聲明只讀變量&#xff0c;也就是說一旦賦值之后就不能再重新賦值了。…

Linux下學【MySQL】中如何實現:多表查詢(配sql+實操圖+案例鞏固 通俗易懂版~)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章是MySQL篇中&#xff0c;非常實用性的篇章&#xff0c;相信在實際工作中對于表的查詢&#xff0c;很多時候會涉及多表的查詢&#xff0c;在多表查詢…

【基礎4】插入排序

核心思想 插入排序是一種基于元素比較的原地排序算法&#xff0c;其核心思想是將數組分為“已排序”和“未排序”兩部分&#xff0c;逐個將未排序元素插入到已排序部分的正確位置。 例如撲克牌在理牌的時候&#xff0c;一般會將大小王、2、A、花牌等按大小順序插入到左邊&…

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計

【Flink銀行反欺詐系統設計方案】3.欺詐的7種場景和架構方案、核心表設計 1. **欺詐場景分類與案例說明**1.1 **大額交易欺詐**1.2 **異地交易欺詐**1.3 **高頻交易欺詐**1.4 **異常時間交易欺詐**1.5 **賬戶行為異常**1.6 **設備指紋異常**1.7 **交易金額突變** 2. **普適性軟…

迷你世界腳本生物接口:Creature

生物接口&#xff1a;Creature 彼得兔 更新時間: 2024-05-22 17:51:22 繼承自 Actor 具體函數名及描述如下: 序號 函數名 函數描述 1 getAttr(...) 生物屬性獲取 2 setAttr(...) 生物屬性設置 3 isAdult(...) 判斷該生物是否成年 4 setOxygenNeed(…