0

我有一个包含 QTreeWidget 的 Qt 应用程序。我想更换其中一项。

我有一个指针:

QTreeWidgetItem *elementToSubstitute;

和一个返回 a 的函数QTreeWidgetItem*

我想在同一个地方用这个新元素覆盖前一个元素。如果我删除前一个元素并在其后插入新元素,则新项目将放置在树的底部。

我应该如何继续让新分支完全替换以前的分支?

编辑例如


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);
}

......

现在我有一个指向其中一个辣椒的指针。(让我们 sa 级别 1)我想用另一个替换它。例如,我想用孩子“4”替换孩子“2”,但我希望将它放在 f child 2 的位置。

4

3 回答 3

3

你可以尝试做这样的事情:

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

注意:如果yourNewTreeItem已经在树中,这不会影响它的位置,即它不会复制一个节点。

于 2011-10-04T08:16:04.650 回答
0

为什么需要更换整个项目?只需更改当前项目的内容,或将新项目复制到当前项目。

//assuming you have a pointer to the new and the current Item
*currentItem = *newItem; //done
于 2011-10-04T08:51:46.733 回答
0

如果您的项目是顶级的,那么您可以使用 indexOfTopLevelItem 获取它的索引,然后将其从树小部件中删除,然后使用您获得的 insertTopLevelItem 传递索引插入替换项目。如果您的项目不是顶级的,那么您可以使用 indexOfChild 和 insertChild。

于 2011-10-04T08:17:46.347 回答