Прежде всего, вы вызываете некоторые функции для каждой строки, которые нужно вызывать только один раз для полной таблицы. Вместо этого ваш пример кода должен выглядеть примерно так:
ui->tableWidget->setColumnCount(2);
ui->tableWidget->setSortingEnabled(false);
ui->tableWidget->setHorizontalHeaderLabels({"columnname1", "columnname2"});
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
foreach(const QString& key, keys)
{
value = jsonObj.value(key);
int currRow = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(ui->tableWidget->rowCount());
ui->tableWidget->setItem(currRow, 0, new QTableWidgetItem(key));
ui->tableWidget->setItem(currRow, 1, new QTableWidgetItem(value.toString()));
}
ui->tableWidget->sortItems(int (1),Qt::DescendingOrder);
ui->tableWidget->setSortingEnabled(true);
Тогда, если у вас есть новое значение для строки 'name2', вам нужно только заменить значение. Вы уже знаете, как это сделать:
// first find the row index of row 'name2':
int rowIdx = -1;
for(int i = 0; i < ui->tableWidget->rowCount(); i++) {
if(ui->tableWidget->item(i, 0)->text() == "name2") {
rowIdx = i;
break;
}
}
if(rowIdx >= 0) {
// then EITHER replace the item:
ui->tableWidget->setItem(rowIdx, 1, new QTableWidgetItem(value.toString()));
// OR replace the data:
ui->tableWidget->item(rowIdx, 1)->setText(value.toString());
}
Я не скомпилировал этот пример кода, он мог содержать опечатки или неправильные имена функций, но вы поймете идею.