Замена строки в QTableWidget на основе имени ячейки - PullRequest
1 голос
/ 25 июня 2019

Допустим, у меня есть QTableWidget, который выглядит следующим образом:

__| columnname1 | columnname2
1 | name1       | value1
2 | name2       | value2
3 | name3       | value3
4 | name4       | value4

, который я создал с этим кодом:

ui->tableWidget->setColumnCount(2);
foreach(const QString& key, keys)
        {
            value = jsonObj.value(key);
            ui->tableWidget->sortItems(int (1),Qt::DescendingOrder);
            int currRow = ui->tableWidget->rowCount();
            ui->tableWidget->setSortingEnabled(false);
            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->setHorizontalHeaderLabels({"columnname1", "columnname2"});
            ui->tableWidget->setSortingEnabled(true);
            ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }

Теперь, например, у меня есть новое значение для name2Как я могу заменить всю строку, где имя2?? 1007 *

1 Ответ

1 голос
/ 25 июня 2019

Прежде всего, вы вызываете некоторые функции для каждой строки, которые нужно вызывать только один раз для полной таблицы. Вместо этого ваш пример кода должен выглядеть примерно так:

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());
}

Я не скомпилировал этот пример кода, он мог содержать опечатки или неправильные имена функций, но вы поймете идею.

...