首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Qt 5.4 多按鈕共用一個 Slot:用 sender() 獲取觸發對象,判斷 objectName 或 text 區分邏輯

     編輯:程式設計綜合問答

9 個數字按鈕(1-9)共用 `onDigitClicked()`,需知道是哪個按鈕觸發。

核心代碼

// 構造時設置 objectName
for (int i = 1; i <= 9; ++i) {
    QPushButton* btn = new QPushButton(QString::number(i), this);
    btn->setObjectName("btn_" + QString::number(i));
    connect(btn, &QPushButton::clicked, this, &MyWidget::onDigitClicked);
}

// 共用 Slot
void MyWidget::onDigitClicked() {
    QPushButton* btn = qobject_cast(sender());
    if (!btn) return;
    int digit = btn->objectName().split('_').last().toInt(); // 或 btn->text().toInt()
    // 處理 digit...
}

進階:QSignalMapper(Qt 5 棄用,Qt 6 移除)

舊代碼常見 `QSignalMapper`,現代 Qt **直接用 `sender()` + Lambda** 更簡潔:

for (int i = 1; i <= 9; ++i) {
    QPushButton* btn = new QPushButton(QString::number(i));
    connect(btn, &QPushButton::clicked, this, [this, i](){ handleDigit(i); });
}

Lambda 捕獲 `i` 避免 `sender()` 轉換開銷,編譯期內聯,性能最優。

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