2012-12-31 119 views
1

我在更新QTableWidgetItems時遇到問題。我不會在第一次插入明白我在做什麼錯:(QTableWidget更新項目

代碼和解釋。

一步一步的問題。

  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]))); 
    } 
} 
+0

固定,不好意思!雖然它也會被社區看到.. – Nika

回答

1

未滿解決辦法,但一些評論:

1.There可以行內存泄漏

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

爲什麼不使用

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

更安全,更清晰。

2.我的理解是你依靠Info長度與行長度相同的事實,也許值得添加檢查嗎?

+0

我的不好! Info.count()比列更多,所以它提供了訪問衝突。你的例子顯示了我,謝謝! :D – Nika

+0

即使僅將它放入更新行部件中,而不是用於新行插入?如果是這樣,你確定你的信息列表的長度總是相同的 - 也許它會不時變化,這就是爲什麼你偶爾會有空單元格? –

+0

閱讀上面編輯的評論^^ – Nika