【Qt開發】信號與槽

目錄

1,信號與槽的介紹

2,信號與槽的運用

3,自定義信號


1,信號與槽的介紹

????????在Qt框架中,信號與槽機制是一種用于對象間通信的強大工具。它是在Qt中實現事件處理和回調函數的主要方法。

  • 信號:窗口中,當某個事件發生時,一個類可能會發出一個信號。例如,按鈕被點擊、窗口被關閉等。信號是自動觸發的,無需用戶干預,它的本質就是事件。

  • :槽是用來接收并處理信號的函數。槽函數執行特定的操作來響應接收到的信號。簡單來說,對信號做出的響應動作就稱之為槽。通常,會將槽與信號關聯起來,以便處理。槽的本質是一種回調函數,在Qt5以及更高版本中,槽函數與普通函數基本沒啥區別。

????????在Qt中,用戶和控件的每次交互過程稱為一個事件。比如 “用戶點擊按鈕” 是?個事件,“用戶關閉窗口”?也是?個事件。每個事件都會發出一個信號,信號發出后將會進行槽處理,例如用戶點擊按鈕會發出 “按鈕被點擊” 的信號,用戶關閉窗口會發出 “窗口被關閉”?的信號,然后接收該信號的槽將會執行對應的處理函數。

2,信號與槽的運用

認識QObject:

????????QWidget是 Qt 框架中的一個核心基類,主要用于實現對象間的通信機制(如信號與槽機制),并提供基礎的對象管理功能,如事件處理、幾何坐標管理、內置信號和槽等,這一點通過Qt的不斷學習我們會諑漸認識到。

? ? ? ? Qt系統中提供的類本身是存在一定的繼承關系。如QPushButton、QLineEdit、QTextEdit、QLabel等,它們都有共同的父類,即QWidget,它是一個控件,也就是圖形化界面中的小部件。QWidget還有一個父類——QObject。可以說所有的事務類都繼承QObject。

? ? ? ? 在Qt中,每個繼承自QWidget(或者更準確地說,繼承自QObject)的部件(Widget)都內置了一系列預定義的信號和槽,例如,QPushButton有一個clicked()信號,當按鈕被點擊時會發出這個信號。

認識connect函數:

????????在 Qt 中,QObject 類提供了一個靜態成員函數 connect(),該函數用于連接信號和槽。

函數格式:

? ? ? ? 形式 一:connect(const QObject *sender,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const char *signal,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????const QObject *receiver,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? const char *method,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Qt::ConnectionType type = Qt::AutoConnection)

???????? ? ? ? 形式二:connect(const QObject* sender,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const QMetaMethod& signal,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?const QObject* receiver,

?????????????????????????????????????const QMetaMethod& method,
? ? ? ? ? ? ? ? ? ? ? ????????? ? ? ?Qt::ConnectionType type = Qt::AutoConnection);

參數說明:???????

????????sender:發出信號的對象。

????????signal:要連接的信號。

????????receiver:接收信號并處理它的對象。

????????method:槽,即響應信號的方法。

????????type:用于指定關聯方式,暫時先不做考慮。

? ? ? ? 形式二中第二個參數和第四個參數使用函數指針代替字符串來指定信號和槽,使編譯器在編譯期檢查信號和槽的簽名是否兼容,從而減少運行時錯誤。

connect運用樣例:

? ? QPushButton* pushButton = new QPushButton(this);
? ? pushButton->setText("Qt");
? ? connect(pushButton, &QPushButton::clicked, this, &Widget::handleClick);

? ? 槽函數的定義:

????void Widget::handleClick()
? ? {
? ? ? ? if (pushButton->text() == QString("Qt")) {
? ? ? ? ? ? pushButton->setText("Hello Qt");
? ? ? ? }
? ? ? ? else {
? ? ? ? ? ? pushButton->setText("Qt");
? ? ? ? }
? ? }

? ? ? ? 注意:通過圖形化界面生成的信號與槽機制(.ui文件進行操作)時,槽函數的名稱不能隨意更改,因為 .ui 文件內部專門生成的槽函數名來連接信號的,若是修改了函數名,它將不能正常連接。

3,自定義信號

? ? ? ? 自定義信號在實際開發中很少遇到,因為內置的信號基本包含了用戶的事件相關操作。這里知道即可。

? ? ? ? 信號是一種特殊的函數機制,它的返回值必須是void,參數可有可無。這個函數的定義是 Qt 在編譯過程中自動生成的,因此,自定義信號只需寫出函數聲明,并告訴 Qt 這是一個 “信號” 即可。

? ? ? ? 自定義信號的運用需要使用 signals(自定義信號的標志)和 emit(發送信號)關鍵字。內置信號不需要手動觸發(也可以使用emit發送,改變觸發模式),用戶在 GUI 進行相關操作時,就會自動觸發信號。發送信號的代碼已經內置到 Qt 框架中了。

樣例:

??????widget.h文件里的Widget類中添加以下代碼:

? ? ? ????????signals:
? ? ? ? ? ? ? ????????void mySignal(const QString&); ?// 自定義信號mySignal()
? ? ? ? ? ? ? ????????void handleMySignal(const QString&); // 槽函數

? ? ? 在widget.cpp文件中添加以下代碼:

? ? ? ? ? ? ? ?// 連接信號與槽

??????????????connect(this, &Widget::mySignal, this, &Widget::handleMySignal);
??????????????// 發送出自定義的信號,類似內置信號中用戶點擊按鈕然后自動發送信號。
??????????????emit mySignal("處理自定義信號");// 發送信號的操作是根據用戶操作的情況進行的
????????????void Widget::handleMySignal(const QString& text)// 參數text="處理自定義信號"
????????????{
? ? ??????? ? ? this->setWindowTitle(text);
??????????? }

????????注意:Qt5及更高的版本中,不加 emit 也能發送信號,但建議還是加上,使代碼可讀性更高。自定義信號的參數可以比槽函數的參數數量多,但參數之間的類型必須一樣,且槽函數的參數不能比信號的參數多。因為一個槽函數可以綁定多個信號,若嚴格要求參數個數一致,就意味著信號綁定到槽函數的要求就變高了,而這樣設置是為了使更多的信號綁定到一個槽函數上。

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

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

相關文章

數據庫基礎:概念、原理與實戰示例

在當今信息時代,數據已經成為企業和個人的核心資產。無論是社交媒體、電子商務、金融交易,還是物聯網設備,幾乎所有的現代應用都依賴于高效的數據存儲和管理。數據庫(Database)作為數據管理的核心技術,幫助…

前端-HTML基本概念

目錄 什么是HTML 常用的瀏覽器引擎是什么? 常見的HTML實體字符 HTML注釋 HTML語義化是什么?為什么要語義化?一定要語義化嗎? 連續空格如何渲染? 聲明文檔類型 哪些字符集編碼支持簡體中文? 如何解…

Linux進程信號處理(26)

文章目錄 前言一、信號的處理時機處理情況“合適”的時機 二、用戶態與內核態概念重談進程地址空間信號的處理過程 三、信號的捕捉內核如何實現信號的捕捉?sigaction 四、信號部分小結五、可重入函數六、volatile七、SIGCHLD 信號總結 前言 這篇就是我們關于信號的最…

C++ 字符格式化輸出

文章目錄 一、簡介二、實現代碼三、實現效果 一、簡介 這里使用std標準庫簡單實現一個字符格式化輸出&#xff0c;方便后續的使用&#xff0c;它有點類似Qt中的QString操作。 二、實現代碼 FMTString.hpp #pragma once#include <cmath> #include <cstdio> #include…

python高級特性

json.dumps({a:1,n:2}) #Python 字典類型轉換為 JSON 對象。相當于jsonify data2 json.loads(json_str)#將 JSON 對象轉換為 Python 字典 異步編程&#xff1a;在異步編程中&#xff0c;程序可以啟動一個長時間運行的任務&#xff0c;然后繼續執行其他任務&#xff0c;而無需等…

ubuntu24離線安裝docker

一、確認ubuntu版本 root@dockerserver:/etc/pam.d# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.2 LTS Release: 24.04 Codename: noble 根據codename確認。 docker官方網址下載 https://download.docker.com/linux/…

索尼(sony)攝像機格式化后mp4的恢復方法

索尼(sony)的Alpha 7 Ⅳ系列絕對稱的上是索尼的“全畫幅標桿機型”&#xff0c;A7M4配備了3300萬像素的CMOS&#xff0c;以及全新研發的全畫幅背照式Exmor R?CMOS影像傳感器&#xff0c;搭載BIONZ XR?影像處理器&#xff0c;與旗艦微單?Alpha 1如出一轍。下面我們來看看A7M4…

2025最新出版 Microsoft Project由入門到精通(七)

目錄 優化資源——在資源使用狀況視圖中查看資源的負荷情況 在資源圖表中查看資源的負荷情況 優化資源——資源出現沖突時的原因及處理辦法 資源過度分類的處理解決辦法 首先檢查任務工時的合理性并調整 增加資源供給 回到資源工作表中雙擊對應的過度分配資源 替換資…

最短路與拓撲(1)

1、找最長良序字符串 #include<bits/stdc.h> using namespace std; const int N105; int dis[N]; int vis[N]; int edge[N][N]; int n,m; int vnum;void dij(int u, int v) {// 初始化距離數組和訪問標記for(int i0; i<vnum; i) {vis[i] 0;dis[i] edge[u][i];}// D…

降低60.6%碰撞率!復旦大學地平線CorDriver:首次引入「走廊」增強端到端自動駕駛安全性

導讀 復旦大學&地平線新作-CorDriver: 首次通過引入"走廊"作為中間表征&#xff0c;揭開一個新的范式。預測的走廊作為約束條件整合到軌跡優化過程中。通過擴展優化的可微分性&#xff0c;使優化后的軌跡能無縫地在端到端學習框架中訓練&#xff0c;從而提高安全…

CSS flex:1

在 CSS 中&#xff0c;flex: 1 是一個用于彈性布局&#xff08;Flexbox&#xff09;的簡寫屬性&#xff0c;主要用于控制 flex 項目&#xff08;子元素&#xff09;如何分配父容器的剩余空間。以下是其核心作用和用法&#xff1a; 核心作用 等分剩余空間&#xff1a;讓 flex …

1.6 關于static和final的修飾符

一.static static是靜態修飾符&#xff0c;用于修飾類成員&#xff08;變量&#xff0c;方法&#xff0c;代碼塊&#xff09; 被修飾的類成員屬于類&#xff0c;不必生成示例&#xff0c;即可直接調用屬性或者方法。 關于代碼塊&#xff0c;被static修飾的代碼塊是靜態代碼塊…

數據結構—(鏈表,棧,隊列,樹)

本文章寫的比較亂&#xff0c;屬于是縫合怪&#xff0c;很多細節沒處理&#xff0c;顯得粗糙&#xff0c;日后完善&#xff0c;今天趕時間了。 1. 紅黑樹的修復篇章 2. 紅黑樹的代碼理解&#xff08;部分寫道注釋之中了&#xff09; 3. 隊列與棧的代碼 4. 重要是理解物理邏輯&a…

每日Prompt:發光線條解剖圖

提示詞 一幅數字插畫&#xff0c;描繪了一個 [SUBJECT]&#xff0c;其結構由一組發光、干凈且純凈的藍色線條勾勒而成。畫面設定在深色背景之上&#xff0c;以突出 [SUBJECT] 的形態與特征。某個特定部位&#xff0c;如 [PART]&#xff0c;通過紅色光暈加以強調&#xff0c;以…

【時時三省】(C語言基礎)使用字符串處理函數

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 在C函數庫中提供了一些用來專門處理字符串的函數&#xff0c;使用方便。幾乎所有版本的C語言編譯系統都提供這些函數。下面介紹幾種常用的函數。 ①puts函數 輸出字符串的函數 其一般形式…

構建可信數據空間需要突破技術、規則和生態三大關鍵

構建可信數據空間需要突破技術、規則和生態三大關鍵&#xff1a;技術上要解決"可用不可見"的隱私計算難題&#xff0c;規則上要建立動態確權和跨境流動的治理框架&#xff0c;生態上要形成多方協同的標準體系。他強調&#xff0c;只有實現技術可控、規則可信、生態協…

模板的使用

模板 模板的概念&#xff1a;模板就是建立一個通用的模具&#xff0c;大大提高復用性 c中模板機制分為兩類 函數模板 建立一個通用函數&#xff0c;其函數返回值類型和形參類型可以不具體定制&#xff0c;用一個虛擬的類型來代表 template<typename T> //template 聲…

YOLOv1:開啟實時目標檢測的新篇章

YOLOv1&#xff1a;開啟實時目標檢測的新篇章 在深度學習目標檢測領域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列算法無疑占據著重要地位。其中&#xff0c;YOLOv1作為開山之作&#xff0c;以其獨特的設計理念和高效的檢測速度&#xff0c;為后續的目標…

vim中的查找

在 Vim 中&#xff0c;使用 n 鍵可以按正向&#xff08;向下&#xff09;繼續查找下一個匹配項。若要反向&#xff08;向上&#xff09;查找&#xff0c;可以使用以下方法&#xff1a; 1. 使用 N 鍵反向查找 在查找命令&#xff08;如 /keyword&#xff09;后&#xff0c;按下…

卡爾曼濾波通俗理解

卡爾曼濾波器的目的與意義何在&#xff1f; - 陳不陳的回答 - 知乎 https://www.zhihu.com/question/41351736/answer/3057034500 這是一個比較通俗易懂的例子&#xff0c;讀完之后可以對卡爾曼濾波怎么使用有比較直觀的理解。 &#x1f9e0; 一、卡爾曼濾波是什么&#xff1f;…