問題:itemChanged 槽函式中呼叫 setData 修改其他儲存格,再次觸發 itemChanged 形成死迴圈。
// 僅在使用者編輯完成時發射,程式碼 setData 不會觸發
connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(onCellChanged(int,int)));
void onCellChanged(int row, int col) {
QTableWidgetItem* item = ui->tableWidget->item(row, col);
if (!item) return;
// 根據 item->text() 計算其他欄位
// 此處 setData 不會再次觸發 cellChanged
ui->tableWidget->blockSignals(true); // 額外保險
ui->tableWidget->setItem(otherRow, otherCol, new QTableWidgetItem(result));
ui->tableWidget->blockSignals(false);
}
| 訊號 | 觸發時機 | 程式碼 setData 是否觸發 |
|---|---|---|
| itemChanged | Item 任何屬性變更(含程式碼) | 是 → 易死迴圈 |
| cellChanged | 使用者編輯完成(焦點離開/Enter) | 否 → 安全 |
Qt 文檔明確建議:「程式碼修改模型時用 blockSignals 或改用 cellChanged」。