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

QTableWidget itemChanged 遞迴觸發:改用 cellChanged 訊號

     編輯:程式設計疑難解答

問題:itemChanged 槽函式中呼叫 setData 修改其他儲存格,再次觸發 itemChanged 形成死迴圈。

解決:使用 cellChanged 訊號

// 僅在使用者編輯完成時發射,程式碼 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 是否觸發
itemChangedItem 任何屬性變更(含程式碼)是 → 易死迴圈
cellChanged使用者編輯完成(焦點離開/Enter)否 → 安全

Qt 文檔明確建議:「程式碼修改模型時用 blockSignals 或改用 cellChanged」。

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