2011-07-16 11 views
0

QTreeWidgetを使用して、親ノードのツリーを表示します。ノードは ノードです。各親はさまざまなリーフノードを持つことができますが、リーフノードは の子を持たないようにしてください。ユーザーは、 を新しい位置にドラッグすることで、親の間で葉を移動することができるはずです。他の葉に葉が落ちないように、 は葉にItemIsDragEnabledしか設定していませんが、には 親ノードがあります。 QTreeWidgetが "SingleSelection"に設定されている場合、これはうまく動作します。 のselectionModeがExtendedSelectionに設定されている場合しかし、あなたは することができます一緒に休暇や親ノードを選択して、葉の上にそれらの両方をドロップ:http://i.stack.imgur.com/Kil3y.jpg(スクリーンショット)QTreeWidget(Qt4)とdrag'n'dropを使用した親ノードと子ノードの混在

ここではサンプルコードです:

QTreeWidget *tree = this->ui->treeWidget; 
QTreeWidgetItem *item; 
QTreeWidgetItem *child; 
tree->setSelectionMode(QAbstractItemView::ExtendedSelection); 
tree->setDefaultDropAction(Qt::MoveAction); 
tree->setDragEnabled(true); 
tree->setAcceptDrops(true); 
tree->setDropIndicatorShown(true); 

// disable dropping of leaves as top level items 
tree->invisibleRootItem()->setFlags(Qt::ItemIsSelectable | 
       Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 

for (int i = 0; i < 2; i++) { 
    // create top level item 
    item = new QTreeWidgetItem(); 
    item->setText(0, "parent"); 
    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable 
        | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled); 

    // add 3 child items 
    for (int j = 0; j < 3; j++) { 
     child = new QTreeWidgetItem(); 
     child->setText(0, "child"); 
     child->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable 
         | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled); 
     item->addChild(child); 
    } 

    // add item to tree 
    tree->addTopLevelItem(item); 
} 

私は非常に多くのグーグルを探せましたが、解決策を思いつくことができませんでした。 ExtendedSelectionを使用しているときに、どのように子ノードと親ノードをそれぞれのレベルに保つことができますか?

QTreeWidgetのサブクラスで、insertRows()をオーバーライドする必要がありますか? QTreeWidget上で drag'n'dropアクションを傍受する方法はありますか?そうすれば、アクションが正常かどうかを確認できますか? (これはQStandardItemModel/QTreeViewで動作するように取得する方法がある 場合、私はあまりにも幸せ だろう)

答えて

0

一つの簡単な回避策はありません選択からすべての項目を削除し、信号itemSelectionChangedに少し機能を接続することです最後に選択したアイテムと同じタイプのアイテムです。私にとっては完璧な作品です(また、Warcraft 3トリガーエディタのような他のプログラムの場合)

+1

ありがとうございました – nurio

関連する問題