2011-10-04 26 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