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