QT從入門到精通(二) ——信號與槽機制

Qt 的信號與槽機制(Signal and Slot)是 Qt 框架 中用于對象間通信的核心機制之一。它允許對象之間進行松耦合的事件驅動式通信,尤其適合 GUI 應用程序 中的事件處理。


1. 基本概念

信號 (Signal)

  • 當對象的狀態發生變化時,它會發出一個信號
  • 信號是一種聲明,不需要實現。
  • 信號不需要知道誰會接收它,也就是松耦合的設計。

槽 (Slot)

  • 槽是一個普通的函數,可以用來接收信號。
  • 當信號發出時,與之關聯的槽函數將被自動調用。
  • 槽可以是成員函數、普通函數或 lambda 表達式。

連接 (Connect)

  • 信號和槽通過 QObject::connect() 進行連接。
  • 當信號發出時,Qt 會自動調用與其連接的槽。

2. 信號與槽的工作原理

Qt 的信號與槽機制基于 元對象系統(Meta-Object System),它使用以下特性:

  • Q_OBJECT 宏:類中必須包含此宏,表示該類支持信號與槽。
  • moc 工具:Qt 的元對象編譯器,會處理信號與槽相關的代碼。

Qt 的 事件循環 負責在對象間傳遞信號,確保槽在正確的上下文中執行。


3. 信號與槽的定義與使用

1) 定義一個信號與槽

要使用信號與槽,必須滿足以下條件:

  • 類需要繼承自 QObject
  • 在類聲明中加入 Q_OBJECT 宏。
  • 使用 signals 關鍵字聲明信號。
  • 使用 slots 關鍵字聲明槽函數。

示例代碼:

定義類:
#include <QObject>
#include <QDebug>class MyObject : public QObject {Q_OBJECTpublic:explicit MyObject(QObject *parent = nullptr) : QObject(parent) {}signals:void mySignal(int value); // 聲明一個信號public slots:void mySlot(int value) {  // 定義一個槽qDebug() << "Received signal with value:" << value;}
};

在這里插入圖片描述

連接信號與槽:
#include <QCoreApplication>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);MyObject obj1, obj2;// 連接信號與槽QObject::connect(&obj1, &MyObject::mySignal, &obj2, &MyObject::mySlot);// 觸發信號emit obj1.mySignal(42);return a.exec();
}

在這里插入圖片描述

輸出結果:

Received signal with value: 42

2) 連接方式

QObject::connect 有多種形式,支持不同的連接模式。

語法:

QObject::connect(sender, SIGNAL(signalName(params)), receiver, SLOT(slotName(params)));

現代寫法(推薦): 使用函數指針和 lambda 表達式。

QObject::connect(sender, &ClassName::signalName, receiver, &ClassName::slotName);

Lambda 表達式示例:

QObject::connect(&obj1, &MyObject::mySignal, [](int value) {qDebug() << "Lambda slot received value:" << value;
});

3) 信號與槽的重載

如果信號或槽有多個重載版本,必須在連接時指定函數指針。

示例:

class Example : public QObject {Q_OBJECT
signals:void valueChanged(int);void valueChanged(double);
};Example obj;
QObject::connect(&obj, static_cast<void (Example::*)(int)>(&Example::valueChanged), &obj, [](int value) { qDebug() << "Int version called:" << value; });

4. 信號與槽的特點

  1. 松耦合
    • 信號的發送者和槽的接收者無需了解彼此的存在。
  2. 類型安全
    • 信號與槽的參數必須匹配,否則編譯器會報錯。
  3. 多對多關系
    • 一個信號可以連接多個槽。
    • 多個信號可以連接到同一個槽。
  4. 線程安全
    • 跨線程連接時,信號會安全地傳遞到接收線程。

5. 信號與槽的連接類型

在多線程程序中,Qt 提供了不同的連接類型:

連接類型:

  1. Qt::AutoConnection(默認)

    • 如果信號和槽在同一線程中,則為直接連接
    • 如果在不同線程中,則為隊列連接
  2. Qt::DirectConnection

    • 信號發出后,槽會立即執行,位于發送線程。
  3. Qt::QueuedConnection

    • 信號會進入接收線程的事件隊列,由接收線程執行。
  4. Qt::BlockingQueuedConnection

    • 發送線程阻塞,直到槽函數執行完畢。僅適用于跨線程。

6. 注意事項

  1. 使用 Q_OBJECT
    • 類必須繼承自 QObject,并包含 Q_OBJECT 宏,否則信號與槽不會工作。

在這里插入圖片描述

  1. moc 工具的支持

    • 需要使用 Qt 的 Meta-Object Compiler (moc) 進行預處理,否則信號與槽無法解析。
  2. 參數匹配

    • 信號與槽的參數個數和類型必須兼容。信號的參數可以多于槽的參數,但前者必須兼容后者。
  3. 析構時自動斷開連接

    • 當對象被銷毀時,Qt 會自動斷開與該對象相關的所有連接。

在這里插入圖片描述

總結

Qt 的信號與槽機制是一種強大且靈活的事件處理機制,它提供了類型安全松耦合的通信方式,廣泛用于 Qt 應用程序中的 組件間交互事件處理
現代 C++ 寫法(函數指針和 Lambda 表達式)更加簡潔和安全,推薦在新代碼中使用。

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

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

相關文章

如何使用git新建本地倉庫并關聯遠程倉庫的步驟(詳細易懂)

一、新建本地倉庫并關聯遠程倉庫的步驟 新建本地倉庫 打開終端&#xff08;在 Windows 上是命令提示符或 PowerShell&#xff0c;在 Linux 和Mac上是終端應用&#xff09;&#xff0c;進入你想要創建倉庫的目錄。例如&#xff0c;如果你想在桌面上創建一個名為 “my - project”…

1Panel應用推薦:MaxKB開源知識庫問答系統

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款現代化、開源的Linux服務器運維管理面板&#xff0c;它致力于通過開源的方式&#xff0c;幫助用戶簡化建站與運維管理流程。為了方便廣大用戶快捷安裝部署相關軟件應用&#xff0c;1Panel特別開通應用商店&am…

element plus的table組件,點擊table的數據是,會出現一個黑色邊框

在使用 Element Plus 的 Table 組件時&#xff0c;如果你點擊表格數據后出現了一個黑色邊框&#xff0c;這通常是因為瀏覽器默認的焦點樣式&#xff08;outline&#xff09;被觸發了。如圖&#xff1a; 你可以通過自定義 CSS 來隱藏這個黑色邊框&#xff0c;代碼如下&#xff1…

瀧羽sec學習打卡-brupsuite7搭建IP炮臺

聲明 學習視頻來自B站UP主 瀧羽sec,如涉及侵權馬上刪除文章 筆記的只是方便各位師傅學習知識,以下網站只涉及學習內容,其他的都 與本人無關,切莫逾越法律紅線,否則后果自負 關于brupsuite的那些事兒-Brup-IP炮臺搭建 搭建炮臺服務端安裝zmap1、更新系統和安裝基礎依賴&#xff…

赫布定律 | 機器學習 / 反向傳播 / 經驗 / 習慣

注&#xff1a;本文為 “赫布定律” 相關文章合輯。 未整理。 赫布定律 Hebb‘s law 馥墨軒 2021 年 03 月 13 日 00:03 1 赫布集合的基本定義 唐納德?赫布&#xff08;Donald Hebb&#xff09;在 1949 年出版了《行為的組織》&#xff08;The Organization of Behavior&a…

各個數據庫優劣勢對比

1.關系型數據庫&#xff08;RDBMS&#xff09; 優勢&#xff1a; ? 數據一致性&#xff1a;通過嚴格的事務處理和ACID&#xff08;原子性、一致性、隔離性、持久性&#xff09;特性&#xff0c;確保數據的一致性和完整性。 ? 易于理解和使用&#xff1a;關系型數據庫的表結構…

Excel中如何消除“長短款”

函數微調可以可以實施&#xff0c;簡單且易于操作的氣球&#x1f388;漲縮更妙。 (筆記模板由python腳本于2024年12月17日 06:19:13創建&#xff0c;本篇筆記適合用Excel操作數據的coder翻閱) 【學習的細節是歡悅的歷程】 Python 官網&#xff1a;https://www.python.org/ Fre…

Jdk1.7到Jdk1.8 HashMap 發生了什么變化(底層)

從JDK 1.7到JDK 1.8&#xff0c;HashMap在底層實現上發生了顯著的變化&#xff0c; 主要體現在數據結構、鏈表插入方式、哈希算法、擴容機制以及并發性方面。 以下是具體的變化點&#xff1a; 1. 數據結構的變化 JDK 1.7&#xff1a;HashMap的底層數據結構是數組單向鏈表。…

RJ45 網線線序、E1線線序、2B+d線序

1、RJ45 網線線序 線序排列如下&#xff1a; T568A線序&#xff1a;綠白—1&#xff0c;綠—2&#xff0c;橙白—3&#xff0c;藍—4&#xff0c;藍白—5&#xff0c; 橙—6&#xff0c;棕白—7&#xff0c;棕—8 T568B線序&#xff1a;橙白—1&#xff0c;橙—2&#xff0c…

FreeBSD安裝教程

FreeBSD 是一個功能強大且可靠的開源 UNIX 操作系統&#xff0c;適合服務器和桌面環境。本文將介紹如何安裝 FreeBSD&#xff0c;從系統準備到基礎設置&#xff0c;為你快速上手提供幫助。 一、準備工作 1. 硬件要求 CPU&#xff1a;支持 x86 或 AMD64 架構的處理器。 內存&a…

Fortify_SCA_v24.2.0

前言 Fortify SCA 支持豐富的開發環境、語言、平臺和框架&#xff0c;可對開發與生產混合環境進行安全檢查。25 種編程語言 超過 911,000 個組件級 API 可檢測超過 961 個漏洞類別 支持所有主流平臺、構建環境和 IDE。 Fortify SCA是一款商業軟件&#xff0c;價格較為昂貴&am…

MyBatis框架的入門

目錄 MyBatis第一章&#xff1a;框架的概述1. MyBatis框架的概述 第二章&#xff1a;MyBatis的入門程序1. 創建數據庫和表結構2. MyBatis的入門步驟 MyBatis 第一章&#xff1a;框架的概述 1. MyBatis框架的概述 MyBatis是一個優秀的基于Java的持久層框架&#xff0c;內部對…

rust的axux框架開啟負載均衡和重啟自身的方法-會議簽到的調優

開啟負載均衡和重啟自身 更換axum后臺的意外解決的嘗試在caddy反代,使用負載均衡,加多一個節點axum主程序 ip映射信息做全局共享axum重啟自身刷新全局共享配置 前期剛實現了rust的后臺關鍵業務.結果出現了兩類大問題停止服務.在正用著的時候,出現很多意外,真是刺激… 更換axum…

深入理解數據庫索引:原理、分類與優化

目錄 1. 索引基礎1.1 索引的工作原理 2. 最左匹配原則2.1 什么是最左匹配原則&#xff1f;2.2 示例說明2.3 最左匹配原則的圖示 3. 索引分類3.1 按數據結構分類3.2 按索引列數分類3.3 按唯一性分類3.4 按存儲方式分類 4. 聚集索引與非聚集索引的區別4.1 聚集索引4.2 非聚集索引…

Three.js相機Camera控件知識梳理

原文&#xff1a;https://juejin.cn/post/7231089453695238204?searchId20241217193043D32C9115C2057FE3AD64 1. 相機類型 Three.js 主要提供了兩種類型的相機&#xff1a;正交相機&#xff08;OrthographicCamera&#xff09;和透視相機&#xff08;PerspectiveCamera&…

Bernstein-type inequality (BTI)

參見論文&#xff1a; Dual-Functional Artificial Noise (DFAN) Aided Robust Covert Communications in Integrated Sensing and Communications 理論 \boxed{} ?用于加框 Lemma 2. (BTI): For any A ∈ C N N \mathbf{A} \in\mathbb{C}^{N\times N} A∈CNN, b ∈ C N …

一條線上的點

給你一個數組 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一個點。求最多有多少個點在同一條直線上。 提示&#xff1a; 1 < points.length < 300points[i].length 2-104 < xi, yi < 104points 中的所有點 互不相同 解析&#xff1a;使用斜…

XX服務器上的npm不知道咋突然壞了

收到同事的V&#xff0c;說是&#xff1a;182上的npm不知道咋突然壞了&#xff0c;查到這里了&#xff0c;不敢動了。 咱一定要抓重點&#xff1a;突然壞了。這里的突然肯定不是瞬間&#xff08;大概率是上次可用&#xff0c;這次不可用&#xff0c;中間間隔了多長時間&#x…

GNSS定位局限性與綜合PNT及5G定位技術研究

摘要 本文主要介紹了GNSS定位技術的系統組成與原理、發展歷程、應用領域及現狀&#xff0c;并分析了其存在的局限性&#xff0c;如信號遮擋、多路徑效應、大氣層干擾等。文章還探討了綜合PNT技術的體系架構、多源信息融合方法以及智能化算法在PNT中的應用&#xff0c;強調了綜…

/hbase/oldWALs 文件

/hbase/oldWALs 是 HBase 中的一個目錄&#xff0c;用于存儲那些不再需要用于恢復目的的 WAL&#xff08;Write-Ahead Log&#xff09;文件。這些文件在 HBase 確認所有的數據都已經從 MemStore 持久化到 HFile 之后&#xff0c;會被移動到這個目錄。 /hbase/oldWALs 目錄中的…