首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Qt學習之路(9):深入理解信號槽機制

     編輯:關於C++

槽函式本質是普通 C++ 成員函式,可 virtual、可重寫、任意存取權限、可被直接呼叫、參數任意類型。唯一差別:可與信號連接,信號觸發時自動回呼。

connect() 原型


connect(sender, SIGNAL(signal), receiver, SLOT(slot));

sender/receiver 為 QObject*,SIGNAL()/SLOT() 宏將函式簽名轉字串。

四種連接模式

  • 一對多:一個信號連多個槽,依序調用但順序不保證
  • 多對一:多個信號連同一槽,任一信號觸發即調用
  • 信號連信號:第一個信號觸發發出第二個信號
  • 解除連接:disconnect(),物件銷毀時自動解除

參數匹配規則

  • 參數個數、類型、順序必須相同
  • 例外:信號參數多於槽參數時,多餘參數被忽略
  • Debug 模式下不相容、不存在、參數名錯誤會發出警告

非 GUI 類別也能用信號槽

connect() 定義在 QObject,繼承 QObject 即可使用:


class Employee : public QObject {
    Q_OBJECT
public:
    Employee() : mySalary(0) {}
    int salary() const { return mySalary; }
public slots:
    void setSalary(int newSalary);
signals:
    void salaryChanged(int newSalary);
private:
    int mySalary;
};

void Employee::setSalary(int newSalary) {
    if (newSalary != mySalary) {
        mySalary = newSalary;
        emit salaryChanged(mySalary);  // 發出信號
    }
}

if 判斷避免循環連接導致無限遞迴。信號槽不限於 GUI,可用於任意 QObject 子類別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved