0

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

....。

今、私はchiledの1つへのポインターを持っています。(レベル1のsaにしましょう)ans私はそれを別のものと交換したいと思います。たとえば、子「2」を子「4」に置き換えたいのですが、これを子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

アイテムがトップレベルの場合は、indexOfTopLevelItemを使用してそのインデックスを取得し、ツリーウィジェットから削除してから、取得したインデックスを渡すinsertTopLevelItemを使用して置換アイテムを挿入できます。アイテムがトップレベルでない場合は、indexOfChildとinsertChildを使用できます。

于 2011-10-04T08:17:46.347 に答える
0

なぜアイテム全体を交換する必要があるのですか?現在のアイテムの内容を変更するか、新しいアイテムを現在のアイテムにコピーするだけです。

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