Qt的信號與槽(二)

Qt的信號與槽(二)

  • 1.自定義槽
  • 2.通過圖形化界面來生成自定義槽
  • 3.自定義信號
  • 3.信號和槽帶參數
  • 4.參數數量
  • 5.connect函數的設計

🌟hello,各位讀者大大們你們好呀🌟🌟
🚀🚀系列專欄:【Qt的學習】
📝📝本篇內容:自定義槽;通過圖形化界面來生成自定義槽;自定義信號;信號和槽帶參數;參數數量;connect函數的設計
????上一篇:Qt的信號與槽(一)
💖💖作者簡介:軒情吖,請多多指教(>> ????? ) ??-

1.自定義槽

在Qt中我們也可以自己定義信號和槽,我們先來講自定義槽,其實自定義的槽和普通的成員函數沒有區別。不過在以前的版本中我們對于自定義的槽函數聲明時需要放在public/private/protected slots:中,
在這里插入圖片描述
學習C++后的同學應該都知道,這個public slots不是C++標準,這是Qt自己拓展的關鍵字,Qt通過qmake代碼生成代碼的方式,掃描到有slots這種,基于特定的關鍵字生成一堆代碼(元編程)。
在這里插入圖片描述
這是最簡單的自定義槽,前面也見過

2.通過圖形化界面來生成自定義槽

在這里插入圖片描述
這個窗口列出了QPushButton提供的所有信號和它父類的信號
在這里插入圖片描述
經過我們一系列的操作,在.h和.cpp中,Qt都幫我們自動生成了槽函數的聲明和定義
在這里插入圖片描述
在這里插入圖片描述
功能也是沒有問題的
在這里插入圖片描述
這其實是通過函數名的方式來自動連接信號和槽的
在這里插入圖片描述
當函數名符合上面的規則后,Qt就自動能夠把信號和槽建立聯系
為了進行驗證,我們修改函數的名字
在這里插入圖片描述
通過下面的提示我可以發現,調用QMetaObject::connectSlotsByName::這個函數就會觸發上述自動連接信號槽的規則。它其實不在我們可以直接看到的文件中,而是在Qt自動生成的ui_widget.h文件中調用的
在這里插入圖片描述
如果使用圖像化界面來創建控件,就推薦使用這種方式來快速的鏈接信號和槽
如果是使用代碼的方式來創建控件,還是得通過connect來連接信號和槽,因為代碼中并沒有調用connectSlotsByName

3.自定義信號

在Qt開發中,自定義信號其實是比較少見的,主要還是自定義槽,因為自定義槽是為了當用戶觸發某些操作后,自定義槽函數是處理業務邏輯的。而自定義信號就是對應用戶的某一個操作,在GUI開發中,這些操作是可以窮舉的,因此我們的Qt內置的一些信號已經足夠我們使用了

在我們前面的使用也發現了,我們的信號本質上也就是一個函數,但是信號是一類比較特殊的函數:我們只需要寫出信號函數的聲明,并且告知Qt這是一個信號即可,信號函數的定義是在編譯階段Qt自動生成的。這主要是因為信號是Qt中特殊的機制,我們的信號函數的實現要配合Qt框架做很多既定的操作
并且我們的信號函數沒有返回值,是void類型的,但是有沒有參數都可以,也支持函數重載
對于自定義信號,Qt還提供了一個拓展的關鍵字signals,它像public/private一樣使用,用來聲明以下的函數是信號函數。它的作用是當qmake在調用代碼掃描/分析工具的時候,掃描到類中用signals這個關鍵字,就自動認為這個關鍵字聲明下的函數是信號函數,并且為信號函數自動生成函數定義
代碼實現目標:通過點擊按鈕來觸發自定義信號,自定義信號被觸發后,修改窗口標題
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
不知道大家有沒有注意是怎么觸發自定義信號的呢?Qt內置的信號觸發是不需要擔心的,Qt已經內置在框架里了,當用戶進行操作后,就會自動觸發。但是自定義信號需要手動觸發,就需要使用到emit關鍵字,這個單詞的意思是“發射”的意思,就是用來觸發自定義信號的。其實在現在的Qt5中不寫emit也是可以的,emit的功能都實現在自定義函數定義中了,現在的emit什么都干,但是為了代碼的可讀性,還是建議加上。

3.信號和槽帶參數

我們的信號和槽函數其實也可以帶函數參數的,當信號有信息需要傳遞給槽函數時,就可以通過參數進行傳遞了。因此我們的槽函數和信號的參數需要一致,但是這里有個例外,參數類型是需要一致,但是個數不一定需要一致,當不一致的時候,只需要滿足信號的參數個數必須多于槽函數即可。
先來看一段單純有相同數量參數的代碼
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
上面一整套代碼展示了通過傳遞參數可以起到一個復用代碼的作用,整體邏輯一致,但是數據不同,就可以根據不同場景傳遞不同參數
Qt內置的信號也有帶參數的,只是不需要我們進行傳遞
在這里插入圖片描述

4.參數數量

接下來該談談我們參數數量的問題了?為什么Qt允許信號的參數多于槽函數而不是一一對應呢?
這其實也是為了更加的靈活,一個槽函數可能綁定多個信號。如果嚴格按照參數數量一致,就會導致信號綁定槽的要求變高。當參數個數不一致時,槽函數參數就會按照順序,拿到信號的的前N個參數,保證每個槽函數的參數都能拿到值。
當槽函數的參數多于信號的參數時就會報錯
在這里插入圖片描述
但是當槽函數的參數少于信號的參數時,同樣的代碼就沒問題
在這里插入圖片描述
并且我們在某個類中使用信號和槽的時候,一定不能沒有Q_OBJECT這個宏定義,必須在類的最開始的地方寫上
在這里插入圖片描述
在這里插入圖片描述
它會展開很多的代碼,并且這些代碼中也是宏,還會展開很多復雜的代碼,設計到Qt的設計原理,如果沒有這個宏,就會報錯,并且提醒你
在這里插入圖片描述

5.connect函數的設計

其實說到底,我們的信號和槽的工作就是為了處理用戶想要執行的操作,所以說引入的connect函數,但是這只是在Qt中是這樣設計的。在像網頁開發,其他的語言中,是將槽函數是作為控件的一個屬性的,而不是像Qt那么麻煩。Qt那么設計的原因是為了能夠將控件和槽函數進行解耦,并且能夠支持多對多,即一個信號可以connect多個槽函數,一個槽函數可以connect多個信號。但是理想是美好的,現實是殘酷的,在實際的開發中,基本上用不到多對多,大部分都是一對一的情況。
在這里插入圖片描述
在這里插入圖片描述
上面演示了簡單的多對多使用

🌸🌸Qt的信號與槽(二)大概就講到這里啦,博主后續會繼續更新更多Qt的相關知識,干貨滿滿,如果覺得博主寫的還不錯的話,希望各位小伙伴不要吝嗇手中的三連哦!如有小伙伴需要Qt的安裝包可以私信我,你們的支持是博主堅持創作的動力!💪💪

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

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

相關文章

Java研學-MongoDB(三)

三 文檔相關 7 文檔統計查詢① 語法: // 精確統計文檔數 慢 準 dahuang> db.xiaohuang.countDocuments({條件}) 4 // 粗略統計文檔數 快 大致準 dahuang> db.xiaohuang.estimatedDocumentCount({條件}) 4② 例子: // 精確統計文檔數 name為奔波兒灞…

TCP協議格式與連接釋放

TCP報文段格式 TCP雖然是面向字節流的,但TCP傳送帶數據單元確是報文段。TCP報文段分為首部和數據段部分,而TCP的全部功能體現在它在首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。 TCP報文段首部的前20字節是…

CSS05:結構偽類選擇器和屬性選擇器

結構偽類選擇器 /*ul的第一個子元素*/ ul li:first-child{background: #0af6f6; }/*ul的最后一個子元素*/ ul li:last-child{background: #d27bf3; } /*選中p1:定位到父元素,選擇當前的第一個元素 選擇當前p元素的父級元素,選中父級元素的第…

使用策略模式 + 自動注冊機制來構建旅游點評系統的搜索模塊

? 目標: 搜索模塊支持不同內容類型(攻略、達人、游記等)每種搜索邏輯用一個策略類表示自動注冊(基于注解 Spring 容器)新增搜索類型時,只需添加一個類 一個注解,無需改工廠、注冊表等&#x…

第八十九篇 大數據開發中的數據算法:貪心策略 - 生活中的“精打細算”藝術

在資源有限的世界里,貪心算法教會我們:局部最優的累積,往往是通往全局最高效的捷徑。本文通過3個生活化場景原創圖表,揭示大數據開發中最實用的優化策略。目錄一、貪心算法核心思想:當下即最優二、三大核心應用場景詳解…

【論文閱讀】Dynamic Few-Shot Visual Learning without Forgetting

系統概述如下: (a) 一個基于卷積神經網絡(ConvNet)的識別模型,該模型包含特征提取器和分類器; (b) 一個少樣本分類權重生成器。這兩個組件都是在一組基礎類別上訓練的,我們為這些類別準備了大量訓練數據。在測試階段,權重生成器會接收少量新類別的訓練數據以及基礎類別的…

HTML應用指南:利用GET請求獲取全國山姆門店位置信息

山姆會員店作為全球知名的零售品牌,自進入中國市場以來,始終致力于為消費者提供高品質商品與便捷的購物體驗。隨著新零售業態的快速發展,門店位置信息的獲取變得愈發重要。品牌通過不斷拓展門店網絡,目前已覆蓋多個一、二線城市&a…

java ThreadLocal源碼分析

寫個demo測試下&#xff1a;private static void testThreadLocal() {ThreadLocal<Integer> threadLocal new ThreadLocal<>();new Thread(){Overridepublic void run() {threadLocal.set(9527);System.out.println("curr thread: " Thread.currentThr…

后端Web實戰(項目管理)

Restful風格 我們的案例是基于當前最為主流的前后端分離模式進行開發 在前后端分離的開發模式中&#xff0c;前后端開發人員都需要根據提前定義好的接口文檔&#xff0c;來進行前后端功能的開發。 后端開發人員&#xff1a;必須嚴格遵守提供的接口文檔進行后端功能開發&#…

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3604. Minimum Time to Reach Destination in Directed Graph 1. 解題思路 這一題思路上就是一個廣度優先遍歷&#xff0c;我們不斷考察當前時間點以及位置…

OpenXR Runtime切換工具-OpenXR-Runtime-Switcher

在開發VR時&#xff0c;有時有多個設備&#xff0c;大家可能也會選擇不同的串流工具&#xff0c;OpenXR類似于默認瀏覽器&#xff0c;如果設置錯誤可能導致游戲無法串流。 推薦一個工具&#xff0c;可以設置默認的OpenXR工具。 OpenXR-Runtime-Switcher 對于沒有的設備&#…

Opencv探索之旅:從像素變化到世界輪廓的奧秘

在你已經能熟練地為圖像施展“降噪”、“縮放”等魔法之后&#xff0c;你的探索之旅來到了一個全新的領域。你可能會好奇&#xff1a;我們人類能輕易地識別出照片中杯子的邊緣、建筑的輪廓&#xff0c;那計算機是如何“看見”這些邊界的呢&#xff1f;僅僅依靠濾波和顏色變換&a…

Ubuntu 22.04 + MySQL 8 無密碼登錄問題與 root 密碼重置指南

背景場景 在 Ubuntu 系統中使用 apt 或 deb 包方式安裝 MySQL 8 時&#xff1a; 初次安裝后會自動初始化數據庫&#xff1b;但 沒有提示 root 初始密碼&#xff1b;導致 mysql -u root -p 無法登錄。 為了解決該問題&#xff0c;通常我們使用 --skip-grant-tables 方式跳過權限…

題解:P13017 [GESP202506 七級] 線圖

首先明白定義&#xff1a; 線圖 L(G)L(G)L(G) 的頂點對應原圖 GGG 的邊&#xff0c;當且僅當原圖中的兩條邊有公共頂點時&#xff0c;對應的線圖頂點之間有一條邊。 不難想到&#xff0c;對于原圖中的每個頂點 vvv&#xff0c;其度數 d(v)d(v)d(v) 對應的邊集可以形成 (d(v)2)\…

c++ duiLib環境集成2

繼續上一篇&#xff0c;現在需要把控制臺隱藏&#xff0c;只顯示調用duiLib框架顯示的窗口。右鍵項目 → 屬性 → 鏈接器 → 系統 → ?子系統?改為 窗口(/SUBSYSTEM:WINDOWS)。原來是這樣&#xff1a;修改為&#xff1a;運行報錯&#xff1a;需要修改入口函數為WinMain。如下…

常見的網絡攻擊方式及防御措施

常見的網絡攻擊方式及防御措施&#xff1a;全面解析網絡安全威脅 前言肝文不易&#xff0c;點個免費的贊和關注&#xff0c;有錯誤的地方請指出&#xff0c;看個人主頁有驚喜。 作者&#xff1a;神的孩子都在歌唱在信息化高速發展的今天&#xff0c;網絡安全威脅無處不在&#…

JavaScript 中導入模塊時,確實不需要顯式地寫 node_modules 路徑。

1. 正確的導入語法在 Webpack、Vite 等打包工具中&#xff0c;node_modules 目錄是默認的模塊搜索路徑&#xff0c;因此直接寫包名即可&#xff1a;// ? 正確&#xff1a;直接使用包名import nprogress/nprogress.css;// ? 錯誤&#xff1a;不需要顯式寫 node_modules 路徑im…

ELK Stack技術棧

文章目錄一、日志收集所解決的問題二、Elastic Stack 組件介紹2.1 Elasticsearch2.2 Logstash2.3 Kibana2.4 Filebeat beats三、ELK Stack集群安裝3.1 安裝JAVA環境&#xff08;所有ES節點&#xff09;3.2 安裝ES集群3.2.1 ES單節點部署3.2.2 ES JAVA調優&#xff1a;堆(heap)內…

大騰智能國產 3D CAD:設計自由度拉滿,數據安全鎖死

在智能制造與數字化轉型的浪潮中&#xff0c;大騰智能CAD作為一款自主研發的三維計算機輔助設計軟件&#xff0c;憑借其從概念設計到制造落地的全流程覆蓋能力&#xff0c;正成為國產工業設計軟件領域的新銳力量。軟件深度融合先進建模技術與工程實踐需求&#xff0c;為機械制造…

ubuntu 操作記錄

1&#xff1a;安裝minicom 1: sudo apt-get install minicom minicom -s 2&#xff1a;Ctrl Z C 的區別 ctrlz的是將任務中斷,但是此任務并沒有結束,他仍然在進程中他只是維持掛起的狀態,用戶可以使用fg/bg操作繼續前臺或后臺的任務,fg命令重新啟動前臺被中斷的任務,bg命令…