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);//如果不符合拖拽要求,这句可以注释掉
QT中在QWidget支持拖拽功能,QTreeWidget继承自QWidget,所以自然也具有节点的拖拽功能。
拖拽包含两个功能:一个是拖动(Drag),一个是放下(Drop)。拖动的数据是QMimeData数据,MIME数据定义格式:类型/数据 (注意中间有斜线)。
若被拖动的对象放下的控件,不接受拖动的对象,Qt光标显示禁用的形状(一个禁用形状)。
开始拖动:通过调用QDrag::exec()函数启动,该函数是一个阻塞函数(但不会阻塞主事件循环),这意味着在拖放操作结束之前,不会返回该
用下面几个参数设置一下即可:
QAbstractItemView.SelectionMode.MultiSelection:多选(无需按ctrl)
QAbstractItemView.SelectionMode.ExtendedSelection:多选(按住ctrl,一次选一项)
QAbstractItemView.SelectionMode.ContiguousSelection:多选(一
QTreeWidget实现拖拽,顶层item拖拽到顶层item时,在当前顶层item前面进行插入,顶层item拖拽到非顶层item上禁止,非顶层item拖拽到顶层item上,当前顶层item添加拖拽的非顶层item,非顶层item拖拽到非顶层item上,当前非顶层item前面插入拖拽的非顶层item。
#include <qdrag.h>
QtMyTreeWidget::QtMyTreeWidget(QWidget *parent) : QTreeWidget(parent)
m_CtrlPresse.
刚进公司没多久,老大就让做一个实现拖放的小插件,要求可拖拽,可缩放。从网上查了很多资料,也看了别人写的demo,总算摸索出一些门道,下面分享给大家,如有疑问,可评论,大家一起学习!
QCTreeWidget.cpp
// 左侧项目树
QCTreeWidget::QCTreeWidget(const QString& text, QWidget *parent)
: ...
QT中在QWidget支持拖拽功能,QTreeWidget继承自QWidget,所以自然也具有节点的拖拽功能。
拖拽包含两个功能:一个是拖动(Drag),一个是放下(Drop)。拖动的数据是QMimeData数据,MIME数据定义格式:类型/数据 (注意中间有斜线)。
若被拖动的对象放下的控件,不接受拖动的对象,Qt光标显示禁用的形状(一个禁用形状)。
开始拖动:通过调用QDrag::exec()...
QTableWidget可以通过setSelectionMode()和setSelectionBehavior()来设置选择的模式。
setSelectionBehavior()
此属性保存视图使用的选择行为。此属性保存选择是根据单个项目,行还是列进行的。
setSelectionMode()
此属性保存视图在哪种选择模式下运行。此属性控制用户是否可以选择一个或多个项目,并且在多个项目...