2011-10-04 25 views
0

我有一個包含QTreeWidget的Qt應用程序。 我想替換其中一個項目。如何重新在Qt樹小部件中的元素?

我有一個指針:

QTreeWidgetItem *elementToSubstitute; 

,並返回一個QTreeWidgetItem*功能。

我想用這個新元素覆蓋前一個,在同一個地方。 如果我刪除之前的元素並在其後插入新元素,則新項目將放置在樹的底部。

我應該如何繼續讓新的分支完全替換之前的分支?

EDIT例如


void MainWindow::addRoot(QString name ,QString description) 
{ 
    QTreeWidgetItem *itm = new QTreeWidgetItem(ui->tree); 
    itm->setText(0,name); 
    itm->setText(1,description); 

    QTreeWidgetItem *child1 = addChild(itm,"one","hello"); 
    QTreeWidgetItem *child2 = addChild(itm,"two","hello"); 
    QTreeWidgetItem *child3 = addChild(itm,"tree","hello"); 
    QTreeWidgetItem *child4 = addChild(itm,"four","hello"); 


    QTreeWidgetItem *parent = child2->parent(); 
    int itemIndex = parent-indexOfChid(child2); 
    parent->removeChild(child2); 
    parent->insertChild(itemIndex, child4); 

} 

QTreeWidgetItem MainWindow::addChild(QTreeWidgetItem *parent,QString name ,QString description) 
{ 
    QTreeWidgetItem *itm = new QTreeWidgetItem(); 
    itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); 
    itm->setText(0,name); 
    itm->setText(1,description); 

    addChild2(itm,"sub-one","subchild2"); 
    addChild2(itm,"sub-two","subchild2"); 
    addChild2(itm,"sub-tree","subchild2"); 

    parent->addChild(itm); 
    return itm; 

} 

void MainWindow::addChild2(QTreeWidgetItem *parent,QString name ,QString description) 
{ 
    QTreeWidgetItem *itm = new QTreeWidgetItem(); 

    itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsEditable); 

    itm->setText(0,name); 
    itm->setText(1,description); 
    itm->setText(2,"test third coloumn"); 
    parent->addChild(itm); 
} 

.....

現在我有一個指針到chiled之一。 (讓我們來看一級)ans我想用另一個替換它。比如我想與孩子「4」來代替孩子「2」,但我想這是擺在地方˚F孩子2.

+0

固定。這是一個錯字...感謝 – Cristas

回答

2

你可以嘗試做這樣的事情:

QTreeWidgetItem *parent = elementToSubstitute->parent(); 
int itemIndex = parent->indexOfChid(elementToSubstitute); 
parent->removeChild(elementToSubstitute); 
parent->insertChild(itemIndex, yourNewTreeItem); 

注意:如果yourNewTreeItem已經在樹中,這將不會影響其位置,即它不會複製節點。

+0

對不起...還沒有解決方案...它仍然洗牌我的元素。最後一次插入到最後。而我neet要留在同一個地方... :( – Cristas

+0

你可以編輯你的問題,你必須做到這一點嗎? – Mat

+0

這有點複雜...因爲我不使用QTreeWidgetItem,但我覆蓋了該類.. 。我可以嘗試使用標準類型編寫一個小例子....我會立即編輯它。:) – Cristas

0

如果您的項目是頂級的,那麼您可以使用indexOfTopLevelItem來獲取它的索引,然後從樹窗口小部件中移除它,然後插入替換項目,使用insertTopLevelItem傳遞您獲得的索引。如果你的項目不是頂級的,那麼你可以使用indexOfChild和insertChild。

0

爲什麼你需要更換整個項目?只需更改當前項目的內容,或者將新項目複製到當前項目中。

//assuming you have a pointer to the new and the current Item 
*currentItem = *newItem; //done 
+0

我試過...但是在我必須將它更新到樹之後...怎麼做?我tryed ui-> treeWidget-> setCurrentItem(currentItem);但沒有成功... – Cristas

+0

http://doc.qt.nokia.com/4.7/qabstractitemview.html#update – RedX