2014-04-24 38 views
0

我在QStandardItemModel上遇到了一些問題。 我想要做的是將一個列表添加到我的模型中,當列表更新時,我將新列表傳遞給參數,清除舊模型並添加新列表。 這聽起來很簡單,但我遇到了一個我無法弄清楚的錯誤。當我將第一個列表添加到模型中時沒有問題,但是當我添加第二個列表時,第一個列表成功刪除(我可以在控制檯中看到),但是應用程序崩潰。如何從QStandardItemModel中刪除所有項目

這裏是我的代碼:

void MyModel::updateList(QList<QStandardItem*> list) 
{ 

    // Delete current model 

    int rows = rowCount(); 
    for (int i = 0 ; i < rows ; i++) 
    { 
     if(item(0)->hasChildren()) 
     { 
      int children = item(0)->rowCount(); 
      for (int j = 0 ; j < children ; j++) 
      { 
       QString name = item(0)->child(0)->accessibleText(); 
       qDebug()<<(name + QLatin1String("\tremoved")); 
       item(0)->removeRow(0); 
      } 
     } 
     QString itemRemoved = item(0)->accessibleText(); 
     qDebug()<<(itemRemoved + QLatin1String("\tremoved")); 
     removeRow(0); 
    } 


    // Add new list to model 

    for(int j=0 ; j<list.count() ; j++) 
    { 
     appendRow(list[j]); 
     qDebug()<< (list[j]->accessibleText() + tr(" ADDED")); 
    } 

    printf("List UPDATED \n"); 
} 

顯然我已經使用方法clear();,而不是通過行刪除行嘗試,但它具有相同的效果。

我不明白爲什麼這段代碼不起作用。

如果有人能夠對此事發表一些看法,我會非常感激。

+0

到底在哪(以怎樣的消息)它會崩潰?另外,你應該避免在C++中使用C風格的輸出('printf');) – SingerOfTheFall

+0

沒有消息,它只是在for循環中的第一個'appendRow()'處崩潰,它添加了新列表。我實際上通過在前面和後面放置一個'printf'並意識到只有第一個被打印到控制檯上發現了這一點。 – Simpsons

+0

項目層次結構的外觀如何?您刪除子項目,但僅添加頂級項目。 – vahancho

回答

0

問題來自於我將輸入列表中的項目直接添加到新列表中的事實。由於輸入列表是在不同的類中創建的,因此其中的項的父項是不同的,並且在嘗試從新列表中刪除它時,會導致應用程序崩潰。

void MyModel::updateList(QList<QStandardItem*> list) 
{ 
    clear(); 

    for(int i=0 ; i<list.count() ; i++) 
    { 
     QStandardItem *l_item = new QStandardItem(list[i]->text()); 
     l_item->setEditable(false); 
     l_item->setCheckable(true); 
     appendRow(l_item); 
     for (int j = 0 ; j<list[i]->rowCount() ; j++) 
     { 
      QStandardItem *l_subItem = new QStandardItem(list[i]->child(j)->text()); 
      l_subItem->setEditable(false); 
      l_subItem->setCheckable(true); 
      l_item->appendRow(l_subItem); 
     } 
    } 
} 

這意味着我不得不通過在輸入列表中兒童的名單運行:

我通過創建自新項目的新名單,只是把舊列表的text()解決問題在之前的評論中指出,因爲通過創建新的項目我需要重新追加它們。

感謝所有幫助

1

下面的代碼是在PyQt的,但它是非常相似,你需要什麼:

model.removeRows(0, model.rowCount()) 
相關問題