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で動作するように取得する方法がある 場合、私はあまりにも幸せ だろう)
ありがとうございました – nurio