treeWidget->setDragEnabled(true); // 设置控件内部移动 treeWidget->setDragDropMode(QAbstractItemView::InternalMove); // 设置移动模式 treeWidget->setDefaultDropAction(Qt::MoveAction);

顶部子项设置,禁止其他item放入到当前item的子树中。

QTreeWidgetItem *pChild = new QTreeWidgetItem();
// 关闭item的Drop功能
// 禁用该选项可以防止顶部子项被放入到另一个顶部子项的子节点中
pChild->setFlags(pChild->flags() & ~Qt::ItemIsDropEnabled);

非顶部子项设置,禁止拖拽,并且禁止其他item放入到当前item的子树中

auto childItem = new QTreeWidgetItem(item, QStringList() << "1" << "2");
// 防止移动
childItem->setFlags(childItem->flags() & ~Qt::ItemIsDragEnabled);
// 关闭子item的Drop功能。
// 防止其他item项被放入到该item的子树中
childItem->setFlags(childItem->flags() & ~Qt::ItemIsDropEnabled);
QT 中在Q Widget 支持 拖拽 功能 QT ree Widget 继承自Q Widget ,所以自然也具有节点的 拖拽 功能 拖拽 包含两个 功能 :一个是拖动(Drag),一个是放下(Drop)。拖动的数据是QMimeData数据,MIME数据定义格式:类型/数据 (注意中间有斜线)。 若被拖动的对象放下的控件,不接受拖动的对象, Qt 光标显示 禁用 的形状(一个 禁用 形状)。 开始拖动:通过调用QDrag::exec()...
最近项目需求,需要多个 QT ree Widget 之间可以相互 拖拽 ,在网上找的demo测试了下却是可行,但是这种方法只是针对单个 item 。 后面我会改造成对多个 item (相当于可以复选 拖拽 ) 1. 新建一个继承于QMimeData的类,重写formats和retrieveData的类;新建两个函数,用于getter和setter,MIME的types 2. 新建一个类继承于 QT ree Widget ,重写鼠标按下/鼠标释放/鼠标 移动 开始 拖拽 / 拖拽 移动 / 拖拽 离开/ 拖拽 放下事件 3. 设置Q