QSignalMapper
?是 Qt 提供的一個用于信號映射的類,它允許將多個信號源(例如按鈕點擊)映射到一個單一的槽函數,并傳遞自定義參數。這在需要根據不同的觸發對象執行相似邏輯時非常有用。
用法說明
-
創建?
QSignalMapper
?實例:cpp
QSignalMapper* signal_mapper = new QSignalMapper(this);
-
連接信號與映射關系:
- 將每個按鈕的?
clicked()
?信號連接到?signal_mapper
?的?map()
?槽。 - 使用?
setMapping(QObject*, int)
?設置對應的映射值。
cpp
connect(_btn, SIGNAL(clicked()), signal_mapper, SLOT(map())); signal_mapper->setMapping(_btn, index);
- 將每個按鈕的?
-
綁定最終處理邏輯:
- 連接?
signal_mapper
?的?mapped(int)
?信號到實際處理函數。
cpp
connect(signal_mapper, SIGNAL(mapped(int)), this, SLOT(return_val(int)));
- 連接?
-
實現槽函數:
- 在槽函數中獲取傳入的?
int
?值并執行相應操作。
cpp
void PromptWidget::return_val(int index) { // 處理邏輯 }
- 在槽函數中獲取傳入的?
示例代碼片段
cpp
QSignalMapper* signal_mapper = new QSignalMapper(this);for (int index = 0; index < max_len; index++) {QPushButton* _btn = new QPushButton(btn_name[index], this);btn_layout->addWidget(_btn);connect(_btn, SIGNAL(clicked()), signal_mapper, SLOT(map()));signal_mapper->setMapping(_btn, return_val[index]);if (index == focus_idx) {_btn->setFocus();}
}connect(signal_mapper, SIGNAL(mapped(int)), this, SLOT(return_val(int)));
注意事項
QSignalMapper
?已被標記為過時,在 Qt 5 中仍可用,但在 Qt 6 中已被移除。推薦使用?QMetaObject::invokeMethod
?或 Lambda 表達式替代。- 如果你使用的是 Qt 5 及以上版本,請確保正確包含頭文件?
<QSignalMapper>
?并鏈接相關模塊。