我正在使用 QTreeWidget 显示父节点树及其离开节点。每个父节点可以有不同的叶节点,但叶节点不应该有子节点。用户应该能够通过将叶子拖动到新位置来在父母之间移动叶子。为了避免叶子掉到其他叶子上,我只ItemIsDragEnabled
在叶子上设置,同时ItemIsDropEnabled
在父节点上。如果 QTreeWidget 设置为“SingleSelection”,这可以正常工作。但是,如果将 SelectionMode 设置为ExtendedSelection
您可以同时选择叶子和父节点并将它们都放在叶子上:http: //i.stack.imgur.com/Kil3y.jpg(屏幕截图)
这是示例代码:
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 上的拖放操作,以便我可以检查该操作是否正常?(如果有办法让它与 QStandardItemModel/QTreeView 一起工作,我也会很高兴)