2

我在更新 QTableWidgetItems 时遇到问题。我不明白我做错了什么:(

代码和解释。

一步一步的问题。

  1. 在第一次插入 = OK,所有第一个单元格都被填充。
  2. 更新第一个插入的项目 = OK,所有第一个单元格都被更新。
  3. 在第二次插入 = OK 时,所有第二个单元格都已填充。
  4. 更新第二个插入的项目 = OK,所有第二个单元格都被更新。
  5. 更新第一个插入的项目 = FAIL,所有第一个单元格都被更新,但 NEXT 单元格的第一个表是空的。为什么?

代码:

void MainWindow::fillTable(QList<QByteArray> Info)
{
    int Row = ui->clientsList->rowCount() - 1; //Starts from 0.

    //Check if client row already exists.
    for(int i = Row; i >= 0; i--)
    {
        if(ui->clientsList->item(i, 0)->text().contains(QString(Info[1])))
        {
            //Update row.
            for(int u = 0; u < Info.count() - 1; u++)
            {
                ui->clientsList->setItem(i, u, new QTableWidgetItem(QString(Info[u + 1])));
            }

            return; //avoid new row insertion.
        }
    }

    //Insert new row.
    Row = ui->clientsList->rowCount() + 1;
    ui->clientsList->setRowCount(Row);
    for(int i = 0; i < Info.count() - 1; i++)
    {
        //Fill rows.
        ui->clientsList->setItem(Row - 1, i, new QTableWidgetItem(QString(Info[i + 1])));
    }
}
4

1 回答 1

2

Not full solution yet, but few comments:

1.There may be memory leak in line

ui->clientsList->setItem(i, u, new QTableWidgetItem(QString(Info[u + 1])));

why not use

 ui->clientsList->item(i, u)->setText(QString(Info[u + 1]));

which is safer and more clear.

2.My understanding is you are relying on the fact that Info has same length as the row length is, perhaps it worth to add check for that?

于 2012-12-31T16:40:41.833 回答