添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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()
此属性保存视图在哪种选择模式下运行。此属性控制用户是否可以选择一个或多个项目,并且在多个项目...