界面有多個按鈕(如標籤、分類),點擊後將按鈕文字填入 QLineEdit 搜索框。傳統做法為每個按鈕寫一個槽函數,代碼冗餘。
QSignalMapper *mapper = new QSignalMapper(this);
connect(btn1, &QPushButton::clicked, mapper, static_cast(&QSignalMapper::map));
connect(btn2, &QPushButton::clicked, mapper, static_cast(&QSignalMapper::map));
// ...
mapper->setMapping(btn1, btn1->text());
mapper->setMapping(btn2, btn2->text());
// ...
connect(mapper, static_cast(&QSignalMapper::mappedString),
this, [this](const QString &text) {
lineEdit->setText(text);
});
auto connectBtn = [this](QPushButton *btn) {
connect(btn, &QPushButton::clicked, this, [this, btn]() {
lineEdit->setText(btn->text());
});
};
connectBtn(btn1);
connectBtn(btn2);
// ...
Lambda 更簡潔,無需額外對象,推薦 Qt 5.10+ 使用。