將四個 QPushButton 加入 QButtonGroup,連線 buttonClicked(int) 訊號至槽函數。需求:點擊按鈕後獲取該按鈕的 ID 或指標,以便後續實現「選中按鈕 → 點擊其他位置移動該按鈕」的交互邏輯。
QButtonGroup::buttonClicked(int id) 訊號的參數 正是被點擊按鈕的 ID,直接在槽函數接收即可:
// 建立按鈕群組
QButtonGroup *group = new QButtonGroup(this);
group->addButton(btn1, 1); // 指定 ID
group->addButton(btn2, 2);
group->addButton(btn3, 3);
group->addButton(btn4, 4);
// 連線訊號(Qt5 新語法)
connect(group, QOverload<int>::of(&QButtonGroup::buttonClicked),
this, &MyClass::onButtonClicked);
// 槽函數
void MyClass::onButtonClicked(int id) {
QPushButton *clickedBtn = qobject_cast<QPushButton*>(group->button(id));
if (clickedBtn) {
// 取得 ID 與指標,執行後續邏輯
qDebug() << "Clicked button ID:" << id;
qDebug() << "Button pointer:" << clickedBtn;
// 記錄當前選中按鈕,供移動操作使用
currentSelectedButton = clickedBtn;
}
}
QButtonGroup::buttons() 取得按鈕列表,配合 indexOf() 查找索引。buttonClicked(QAbstractButton*) 重載訊號,直接獲得指標。onButtonClicked 中記錄 currentSelectedButton。mousePressEvent 或目標區域的點擊處理中,判斷若有 currentSelectedButton,則呼叫 move() 或調整佈局位置。mapToGlobal()/mapFromGlobal() 轉換。QButtonGroup 的 buttonClicked(int) 訊號已直接提供按鈕 ID,配合 group->button(id) 即可獲取指標,無需額外查找。善用訊號參數,簡化邏輯。