【问题标题】:How to repace an element in a Qt tree widget?如何替换 Qt 树小部件中的元素?
【发布时间】:2011-10-04 08:05:06
【问题描述】:

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

我有一个指针:

QTreeWidgetItem *elementToSubstitute;

还有一个返回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);
}

.....

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

【问题讨论】:

  • 已修复。这是一个错字...谢谢

标签: qt replace qtreewidget


【解决方案1】:

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

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

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

【讨论】:

  • 抱歉......还没有解决方案......它仍然会洗牌我的元素。最后插入到最后。虽然我需要留在同一个地方...... :(
  • 你能用你必须这样做的代码编辑你的问题吗?
  • 有点复杂...因为我不使用 QTreeWidgetItem 但我覆盖了类...我可以尝试使用标准类型编写一个小示例...我会立即对其进行编辑. :)
  • 这样是不是好一点?
  • 您使用我上面发布的代码示例的部分在哪里?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我尝试过...但是在我必须将其更新到树中之后...该怎么做?我试过 ui->treeWidget->setCurrentItem(currentItem);但没有成功...
    猜你喜欢
    • 2016-05-24
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多