QTreeWidget实现多节点拖拽
1.重载QTreeWidget这个类,在构造函数设置多选节点:
//按 ctrl 或 shift 多选
this->setSelectionMode(QAbstractItemView::ExtendedSelection);
//设置可拖拽性质
this->setDefaultDropAction(Qt::MoveAction);
this->setDragDropMode(QAbstractItemView::DragDrop);
如果需要在实现多节点拖拽的基础上处理业务,就要对下面几个拖拽函数进行重载。
2.声明私有变量m_dragItemVec,用来存储拖拽的节点
std::vector<QTreeWidgetItem*> m_dragItemVec;
3.重写拖拽函数
virtual void dragEnterEvent(QDragEnterEvent *ev);
virtual void dragMoveEvent(QDragMoveEvent * ev);
virtual void dropEvent(QDropEvent *ev);
3.1:对于dragEnterEvent,将选中的items存进私有变量m_dragItemVec
void dragEnterEvent(QDragEnterEvent *ev)
{
ev->setDropAction(Qt::MoveAction);
QList<QTreeWidgetItem*> selectedItem = selectedItems();
m_dragItemVec.clear();
for (int i = 0; i < selectedItem.size(); i++)
{
if (selectedItem[i] && selectedItem[i]->parent())
{
m_dragItemVec.push_back(selectedItem[i]);
}
}
if (m_dragItemVec.size() > 0)
{
ev->acceptProposedAction();
QTreeWidget::dragEnterEvent(ev);
return;
}
ev->ignore();
QTreeWidget::dragEnterEvent(ev);
}
3.2:对于dragMoveEvent,在这里设置可拖拽区域
void dragMoveEvent(QDragMoveEvent * ev)
{
ev->setDropAction(Qt::MoveAction);
QTreeWidgetItem* itemOver = itemAt(ev->pos());
//设置可拖拽区域
if (itemOver != NULL && itemOver->parent() != NULL)
{
ev->acceptProposedAction();
QTreeWidget::dragMoveEvent(ev);
return;
}
}
ev->ignore();
QTreeWidget::dragMoveEvent(ev);
}
3.3:对于dropEvent,在这里插入拖拽节点
void dropEvent(QDropEvent *ev)
{
QTreeWidgetItem* itemOver = itemAt(ev->pos());
if (itemOver != NULL && itemOver->parent())
{
//在此可以对m_dragItemVec做你想做的事
QTreeWidget::dropEvent(ev);
setCurrentItem(itemOver); // 设置为当前选中
itemOver->setExpanded(true);
return;
}
ev->ignore();
//QTreeWidget::dropEvent(ev);//如果不符合拖拽要求,这句可以注释掉
}