信號與槽的總結

信號與槽的總結

QT中的信號與Linux的信號對比

1)信號源

2)信號的類型

3)信號的處理方式

QT信號與Linux信號的深度對比分析

一、信號源對比

QT信號

  • 用戶定義信號

    :由開發者通過

    signals:
    

    關鍵字在QObject派生類中顯式聲明

    class MyObject : public QObject {Q_OBJECT
    signals:void mySignal(int param);
    };
    
  • 框架內置信號:QT框架提供的信號(如QPushButton的clicked())

  • 信號觸發方式

    :通過

    emit
    

    關鍵字顯式觸發

    emit mySignal(42);
    

Linux系統信號

  • 系統預定義信號:由操作系統內核預先定義(如SIGINT、SIGSEGV等)

  • 硬件產生信號:如SIGSEGV(內存訪問錯誤)、SIGFPE(算術異常)

  • 進程間信號

    :通過kill()系統調用發送

    kill(pid, SIGTERM);
    

二、信號類型對比

QT信號類型特征

特性說明
類型安全編譯時檢查參數類型匹配
帶參數可攜帶任意數量、類型的參數
面向對象必須屬于某個QObject派生類
同步/異步默認隊列連接(異步),可設置為直接連接(同步)

Linux信號類型特征

特性說明
固定編號標準信號編號1-31,實時信號34-64
無參數僅信號編號,不能攜帶額外數據
進程級別與特定線程/進程關聯,非面向對象
同步觸發信號處理函數在信號產生時立即執行

常見Linux信號示例:

SIGINT (2):終端中斷信號(Ctrl+C)

SIGKILL (9):強制終止信號

SIGSEGV (11):無效內存訪問

SIGTERM (15):終止請求信號

三、處理方式對比

QT信號處理(信號-槽機制)

// 連接方式
QObject::connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);// 槽函數聲明
public slots:void updateValue(int newValue);**處理特點**:
  1. 多線程安全:自動跨線程事件隊列傳遞
  2. 連接類型:
    • 直接連接(同步執行)
    • 隊列連接(異步,接收者線程事件循環處理)
    • 自動連接(默認,根據線程關系自動選擇)
  3. 內存管理:自動處理對象生命周期(可使用Qt::UniqueConnection)

Linux信號處理

// 信號處理函數注冊
struct sigaction sa;
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);void handler(int sig) {// 信號處理邏輯
}

處理特點

  1. 同步執行:中斷當前執行流立即處理
  2. 限制嚴格:
    • 信號處理函數中只能調用異步信號安全函數
    • 不能使用malloc等非可重入函數
  3. 特殊處理:
    • SIGKILL和SIGSTOP不能被捕獲或忽略
    • 某些信號會導致核心轉儲(如SIGSEGV)

四、關鍵差異總結

對比維度QT信號Linux信號
抽象級別高層次面向對象機制低層次操作系統機制
參數傳遞支持復雜參數傳遞僅信號編號,無參數
線程處理自動處理跨線程通信需要顯式處理線程掩碼
可靠性可靠,不會丟失非實時信號可能丟失
處理時機通過事件循環異步處理立即中斷當前執行流
調試支持可通過QtCreator調試需要gdb等系統級調試工具

五、實際應用場景

QT信號典型用例

  1. GUI事件處理(按鈕點擊、窗口關閉)
  2. 跨線程通信(工作線程到主線程通知)
  3. 模塊間解耦(觀察者模式實現)

Linux信號典型用例

  1. 進程控制(優雅終止服務進程)
  2. 異常處理(內存錯誤、算術異常捕獲)
  3. 進程間簡單通知(無需復雜數據傳遞)

六、高級主題

QT信號的高級特性

  1. Lambda表達式連接:

    connect(button, &QPushButton::clicked, [=](){qDebug() << "Button clicked";
    });
    
  2. 信號轉發:

    connect(obj1, &ClassA::signalA, obj2, &ClassB::signalB);
    
  3. 信號連接管理disconnect()斷開連接

Linux信號的進階處理

  1. 信號屏蔽:

    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    pthread_sigmask(SIG_BLOCK, &set, NULL);
    
  2. 實時信號處理:

    union sigval value;
    value.sival_int = 42;
    sigqueue(pid, SIGRTMIN, value); // 可攜帶少量數據
    
  3. 替代方案:更復雜的進程通信建議使用socket、管道等機制

信號槽中connect函數的使用

connect (const QObject *sender, const char * signal ,const QObject * receiver , const char * method , Qt::ConnectionType type = Qt::AutoConnection )

參數說明:

? sender:信號的發送者;

? signal:發送的信號(信號函數);

? receiver:信號的接收者;

? method:接收信號的槽函數;

? type: ?于指定關聯?式,默認的關聯?式為 Qt::AutoConnection,通常不需要?動設定。

在控件的問題上我們需要查閱的問題

內置了哪些信號,信號是何時觸發的

內置了哪些槽,槽的作用是什么

一、常見控件的內置信號

  1. 按鈕類控件(QPushButton等)

主要內置信號

  • clicked():按鈕被鼠標點擊或鍵盤激活時觸發
  • pressed():按鈕被按下時立即觸發
  • released():按鈕被釋放時觸發
  • toggled(bool checked):可切換按鈕狀態改變時觸發
// 示例:連接按鈕點擊信號
connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
  1. 文本輸入類控件(QLineEdit, QTextEdit)

主要內置信號

  • textChanged(const QString &text):文本內容改變時觸發
  • textEdited(const QString &text):用戶編輯文本時觸發
  • returnPressed():按下回車鍵時觸發
  • editingFinished():編輯完成(失去焦點)時觸發
// 示例:實時響應文本變化
connect(ui->lineEdit, &QLineEdit::textChanged,[this](const QString &text){qDebug() << "Current text:" << text;});
  1. 選擇類控件(QComboBox, QCheckBox, QRadioButton)

主要內置信號

  • currentIndexChanged(int index):當前選項改變時觸發
  • currentTextChanged(const QString &text):當前文本改變時觸發
  • stateChanged(int state):復選框/單選按鈕狀態改變時觸發
// 示例:響應下拉框選擇變化
connect(ui->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),[](int index){qDebug() << "Selected index:" << index;});

二、信號觸發時機詳解

  1. 用戶交互觸發
  • 鼠標事件:點擊、雙擊、懸停等
  • 鍵盤事件:按鍵按下、釋放、輸入等
  • 觸摸事件:觸摸屏交互
  1. 狀態變化觸發
  • 值改變:如滑塊位置、進度條值等
  • 焦點變化:控件獲得/失去焦點
  • 可見性變化:顯示/隱藏狀態改變
  1. 系統事件觸發
  • 定時器超時:QTimer的timeout()信號
  • 網絡響應:QNetworkReply的finished()信號
  • 文件系統變化:QFileSystemWatcher的fileChanged()信號

三、常見控件的內置槽函數

  1. 基礎功能槽
槽函數作用適用控件
setText(const QString &)設置控件文本QLabel, QLineEdit等
clear()清空內容QLineEdit, QTextEdit等
setEnabled(bool)啟用/禁用控件所有QWidget派生類
show()/hide()顯示/隱藏控件所有QWidget派生類
// 示例:使用內置槽
connect(ui->actionClear, &QAction::triggered,ui->textEdit, &QTextEdit::clear);
  1. 狀態控制槽
槽函數作用適用控件
setChecked(bool)設置選中狀態QCheckBox, QRadioButton
setCurrentIndex(int)設置當前選項QComboBox, QTabWidget
setValue(int)設置數值QProgressBar, QSlider
// 示例:控制進度條
connect(ui->startButton, &QPushButton::clicked,[this](){ui->progressBar->setValue(0);});

四、槽函數的作用與分類

  1. 數據操作槽
  • 數據獲取:如text()value()
  • 數據設置:如setText()setValue()
  • 數據清除:如clear()reset()
  1. 狀態控制槽
  • 啟用/禁用控制setEnabled()setDisabled()
  • 可見性控制show()hide()setVisible()
  • 狀態切換setChecked()toggle()
  1. 視圖操作槽
  • 滾動控制scrollToTop()scrollToBottom()
  • 縮放控制zoomIn()zoomOut()
  • 選擇控制selectAll()deselect()

五、信號與槽的高級應用

  1. 自動連接命名槽

QT支持特定命名格式的槽函數自動連接:

// 聲明
private slots:void on_pushButton_clicked();// 實現
void MainWindow::on_pushButton_clicked() {// 無需顯式connect,自動關聯名為"pushButton"的按鈕點擊信號
}
  1. 信號與槽的連接類型
// 五種連接類型
Qt::AutoConnection      // 自動選擇(默認)
Qt::DirectConnection    // 同步直接調用
Qt::QueuedConnection    // 異步隊列調用
Qt::BlockingQueuedConnection // 阻塞式隊列調用
Qt::UniqueConnection    // 唯一連接(防止重復連接)
  1. Lambda表達式作為槽
connect(ui->pushButton, &QPushButton::clicked, [this](){// 可以直接訪問類成員ui->label->setText("Button clicked at " + QTime::currentTime().toString());
});

六、最佳實踐建議

  1. 信號-槽連接規范
    • 優先使用新式語法(&Sender::signal形式)
    • 避免在構造函數中連接尚未完全初始化的對象
  2. 資源管理
    • 使用QPointer管理可能被刪除的對象
    • 及時斷開不再需要的連接(disconnect)
  3. 線程安全
    • 跨線程連接使用QueuedConnection
    • 避免在不同線程間直接操作GUI控件
  4. 性能優化
    • 高頻信號考慮節流(throttling)或防抖(debouncing)
    • 大量連接時考慮使用QSignalMapper或lambda統一處理

自定義槽函數

本質:自定義的一個普通的成員函數

可以讓QTCreator自動生成

自定義信號

本質:成員函數

函數的定義是QT自己生成的,作為程序員只需要寫函數聲明即可

signals:自定義信號的關鍵字

emit:完成信號的發射(emit可以省略)

信號和槽也可以帶參數

發射信號的時候,把參數傳給對應的參數

信號的參數和槽的參數一致

1)類型匹配

2)個數,信號的參數要多于槽的參數

信號槽存在的意義:解耦合

代碼要達到的要求:高內聚,低耦合

具體含義為:對程序影響很小,寫代碼的時候,某個代碼的功能被集中在一起

disconnect的使用方式:類似于connect

lambda表達式簡化槽函數的定義

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

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

相關文章

Python Mitmproxy詳解:從入門到實戰

一、Mitmproxy簡介 Mitmproxy是一款開源的交互式HTTPS代理工具&#xff0c;支持攔截、修改和重放HTTP/HTTPS流量。其核心優勢在于&#xff1a; 多平臺支持&#xff1a;兼容Windows、macOS、Linux三端工具&#xff1a;提供命令行(mitmproxy)、Web界面(mitmweb)、數據流處理(mi…

刷題筆記--串聯所有單詞的子串

題目&#xff1a;1、我的寫法&#xff08;超時&#xff09;從題面自然想到先用回溯算法把words的全排列先算出來&#xff0c;然后遍歷字符串s一次將符合條件的位置加入結果全排列計算所有可能字符串算法寫法&#xff1a;這是一個模板用于所有全排列算法的情況&#xff0c;本質思…

操作系統【1】【硬件結構】【操作系統結構】

一、CPU如何執行程序&#xff1f; 提綱 圖靈機工作方式馮諾依曼模型線路位寬CPU位寬程序執行基本過程執行具體過程 1. 圖靈機工作方式 圖靈機可以視作“一臺帶規則的自動草稿機” 圖靈機基本組成&#xff1a; 紙帶&#xff08;內存&#xff09;&#xff1a;連續格子組成&…

SQLite與MySQL:嵌入式與客戶端-服務器數據庫的權衡

SQLite與MySQL&#xff1a;嵌入式與客戶端-服務器數據庫的權衡 在開發應用程序時&#xff0c;數據庫選擇是一個至關重要的決策&#xff0c;它會影響應用的性能、可擴展性、部署難度和維護成本。SQLite和MySQL是兩種廣泛使用的關系型數據庫管理系統&#xff0c;它們各自針對不同…

CppCon 2018 學習:Smart References

“強類型別名”&#xff08;strong typedefs&#xff09; 的動機和實現&#xff0c;配合一個簡單例子說明&#xff1a; 動機&#xff08;Motivation&#xff09; 用 using filename_t string; 和 using url_t string; 來區分不同的字符串類型&#xff08;比如文件名和網址&…

高性能高準確度的CPU電壓與溫度監測軟件HWInfo

&#x1f5a5;? 一、軟件概述 Windows版&#xff1a;圖形化界面&#xff0c;支持實時監控&#xff08;溫度、電壓、風扇轉速等&#xff09;、基準測試及報告生成&#xff0c;兼容Windows XP至Windows 11系統。Linux版&#xff1a;命令行工具&#xff0c;由openSUSE社區維護&a…

H3C WA6322 AP版本升級

1、查看當前版本&#xff1a;R2444P01 2、官網下載升級文件&#xff1a; WA6300系列版本說明H3C WA6300系列(適用于WA6330、 WA6322、WA6320H、WA6320、 WTU630H、WTU630、WA6330-LI、WA6320-C、WA6320-D、WA6320H-LI、WA6338、WA6322H、WTU632H-IOT、WAP922E、WAP923、WA6320…

用 YOLOv8 + DeepSORT 實現目標檢測、追蹤與速度估算

【導讀】 目標檢測與追蹤技術是計算機視覺領域最熱門的應用之一&#xff0c;廣泛應用于自動駕駛、交通監控、安全防護等場景。今天我們將帶你一步步實現一個完整的項目&#xff0c;使用YOLOv8 DeepSORT實現目標檢測、追蹤與速度估算。>>更多資訊可加入CV技術群獲取了解…

Python實例題:基于 Python 的簡單聊天機器人

Python實例題 題目 基于 Python 的簡單聊天機器人 要求&#xff1a; 使用 Python 構建一個聊天機器人&#xff0c;支持以下功能&#xff1a; 基于規則的簡單問答系統關鍵詞匹配和意圖識別上下文記憶功能支持多輪對話可擴展的知識庫 使用tkinter構建圖形用戶界面。實現至少 …

相機:Camera原理講解(使用OpenGL+QT開發三維CAD)

相機為三維場景提供了靈活便捷的視角變換和交互能力&#xff0c;通過相機操作可以實現全方位、各角度的場景瀏覽。 怎樣在三維場景中引入相機&#xff0c;怎樣處理和實現視角的放縮、移動、旋轉&#xff1f;在視角旋轉時以指定目標為中心又該怎樣處理&#xff1f; 原文&#…

開源的虛擬電廠預測數據:資源、應用與挑戰

引言 虛擬電廠(Virtual Power Plant, VPP)是一種通過聚合分布式能源資源(如太陽能、風能、儲能系統、電動汽車和可控負荷)來優化電力系統運行的數字化能源管理平臺。準確的預測數據是虛擬電廠高效運行的關鍵,而開源數據為研究者和企業提供了低成本、高透明度的解決方案。…

IDE全家桶專用快捷鍵----------個人獨家分享!!

給大家分享一下我個人整理的快捷鍵&#xff0c;其中包含對電腦的操作&#xff0c;以及在編寫代碼時的操作&#x1f680;Window系列1 WindowsR 開啟運行對話框--->輸入cmd啟動黑窗口?2 WindowsE 快速打開我的電腦 ?3 WindowsL 電腦鎖屏 ?4 WindowsD 顯示/恢復桌面 ?5 Win…

人工智能概念:RNN中的基礎Encoder-Decoder框架

文章目錄一、序列&#xff08;Seq2Seq&#xff09;轉換的核心架構二、Encoder-Decoder框架基礎原理2.1 整體工作流程2.2 編碼器&#xff08;Encoder&#xff09;詳解2.3 解碼器&#xff08;Decoder&#xff09;工作機制與缺陷三、基礎框架的核心缺陷分析&#xff08;以"歡…

R 列表:深入解析與高效應用

R 列表&#xff1a;深入解析與高效應用 引言 在R語言中&#xff0c;列表&#xff08;List&#xff09;是一種非常重要的數據結構&#xff0c;它允許我們將不同類型的數據組合在一起。列表在數據分析和統計建模中扮演著至關重要的角色。本文將深入探討R列表的概念、創建方法、…

uniapp 國密sm2加密

1. uniapp 國密sm2加密 在uniapp中使用國密SM2算法進行加密解密&#xff0c;你可以通過安裝第三方庫miniprogram-sm-crypto來實現。這個庫提供了SM2、SM3和SM4算法的實現&#xff0c;可以在小程序和uniapp項目中使用。 1.1. 安裝miniprogram-sm-crypto 首先&#xff0c;你需要…

07_持續集成與部署:DevOps的核心引擎

07_持續集成與部署:DevOps的核心引擎 引言 在快速迭代的軟件開發時代,持續集成(CI)與持續部署(CD)已成為企業提升競爭力的關鍵。通過自動化構建、測試和部署流程,CI/CD能夠顯著縮短交付周期,提高軟件質量,降低發布風險。本文將深入探討CI/CD的核心理念、實施路徑與最…

電腦休眠設置

Dont Sleep的意思就是“不要睡覺”&#xff0c;用在電腦里就是“阻止休眠”的意思。但這款軟件其實有“阻止休眠”和“允許休眠”兩個功能。 阻止休眠時可以選擇事件&#xff0c;是計時器、電池、CPU、網絡這幾個事件進行觸發阻止休假的功能。 允許休眠也可以根據自己的需求進行…

藍牙墨水屏上位機學習(3)

main.js中sendimg()函數學習&#xff0c;對應發送圖片按鈕函數代碼如下&#xff1a;async function sendimg() {const canvasSize document.getElementById(canvasSize).value;const ditherMode document.getElementById(ditherMode).value;const epdDriverSelect document.…

Linux應用基礎

1. 基礎概念 1.1 系統調用 系統調用實際上是Linux內核為上層應用程序提供的API接口&#xff0c;方便應用程序進行調用&#xff0c;類似于SVC。 1.2 庫函數 庫函數是應用層里邊的東西&#xff0c;在系統調用的上層&#xff0c;通常以動態庫文件&#xff08;.so&#xff09;形式…

【時間序列數據處理的噩夢與救贖:一次復雜數據可視化問題的深度復盤】

時間序列數據處理的噩夢與救贖&#xff1a;一次復雜數據可視化問題的深度復盤 創建時間: 2025/7/3 技術棧: Vue 3 TypeScript UniApp ECharts 問題級別: &#x1f534; 系統性架構問題 &#x1f3af; 引言&#xff1a;當簡單需求變成技術噩夢 “老哥&#xff0c;這個圖表時…