QTreeWidget的拖拽功能(可以改变父节点)

QT实现QTreeWidget控件的拖拽功能

先看效果

源码: 

#include <QtWidgets>
#include <iostream>
using namespace std;

void init(QTreeWidget &w) {
	//设置表头标签
	w.setHeaderLabels(QStringList() << QString::fromLocal8Bit("节点") << QString::fromLocal8Bit("内容"));
	QList<QTreeWidgetItem *> list;

	//设置头节点和孩子节点
	for (int i = 0; i < 3; ++i) {	//三个头节点
		QTreeWidgetItem *item = new QTreeWidgetItem(&w);
		item->setFlags(Qt::ItemIsEditable | item->flags());
		cout << item->flags();
		item->setExpanded(true); // 只有设置了父控件,才能展开
		list << item;
		
		//设置父亲节点内容
		item->setText(0, QString::fromLocal8Bit("父节点%1").arg(i));
		item->setText(1, QString::fromLocal8Bit("内容::父亲节点%1").arg(i));

		for (int j = 0; j < 2; ++j) {	//每个头节点有两个孩子节点
			QTreeWidgetItem *child = new QTreeWidgetItem(item);
			child->setFlags(Qt::ItemIsEditable | item->flags());

			//设置孩子节点内容
			child->setText(0, QString::fromLocal8Bit("孩子节点%1::%2").arg(i).arg(j));
			child->setText(1, QString::fromLocal8Bit("内容::孩子节点%1").arg(j));
		}
	}
	//添加头节点到QTreeWidget中
	w.addTopLevelItems(list);
	w.resize(600, 400);	//设置窗口大小
	w.resizeColumnToContents(1);
	w.header()->setSectionsClickable(false);
	w.setEditTriggers(QTreeWidget::DoubleClicked);	//双击编辑
}

//鼠标拖动操作
void setDragAndDrop(QTreeWidget &w) {
	w.setDragEnabled(true);              // 启用拖动
	w.viewport()->setAcceptDrops(true); // viewport 接受放下动作,默认是复制操作
	w.showDropIndicator();               // 设置放下指示
	w.setDragDropMode(QTreeWidget::InternalMove);// 内部 移动
}

//鼠标选择节点
void setSelectionMode(QTreeWidget &w) {
	w.setSelectionBehavior(QTreeWidget::SelectRows);     // 选择行
	w.setSelectionMode(QTreeWidget::ContiguousSelection);// 连续选择
}

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QTreeWidget w;
	// 初始化Tree
	init(w);
	// 设置Tree的拖放
	setDragAndDrop(w);
	// 设置Tree的选定模式和行为
	setSelectionMode(w);
	w.show();
	return a.exec();
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现QTreeWidget之间的拖拽功能,需要进行以下步骤: 1.在源QTreeWidget中启用拖拽功能:调用setDragEnabled(True)方法来启用拖拽功能。 2.实现startDrag方法:当用户开始拖拽一个项目时,调用startDrag方法。该方法创建QDrag对象并将要拖动的数据存储在其中。 3.在目标QTreeWidget中启用放置功能:调用setAcceptDrops(True)方法来启用放置功能。 4.实现dragEnterEvent方法:当用户将拖动的项目拖到目标QTreeWidget上时,调用dragEnterEvent方法。该方法检查拖动的数据是否与目标兼容,并在兼容的情况下接受拖放操作。 5.实现dropEvent方法:当用户在目标QTreeWidget上放置拖动的项目时,调用dropEvent方法。该方法将项目添加到目标QTreeWidget中。 下面是一个示例代码: ```python class TreeWidget(QTreeWidget): def __init__(self, parent=None): super(TreeWidget, self).__init__(parent) self.setAcceptDrops(True) self.setDragEnabled(True) def startDrag(self, event): item = self.currentItem() if item: data = QByteArray() stream = QDataStream(data, QIODevice.WriteOnly) stream.writeQString(item.text(0)) mimeData = QMimeData() mimeData.setData('application/x-qabstractitemmodeldatalist', data) drag = QDrag(self) drag.setMimeData(mimeData) drag.exec_() def dragEnterEvent(self, event): if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'): event.accept() else: event.ignore() def dropEvent(self, event): if event.mimeData().hasFormat('application/x-qabstractitemmodeldatalist'): data = event.mimeData().data('application/x-qabstractitemmodeldatalist') stream = QDataStream(data, QIODevice.ReadOnly) text = '' stream >> text item = QTreeWidgetItem(self) item.setText(0, text) event.accept() else: event.ignore() ``` 在上面的代码中,我们继承了QTreeWidget类,并重写了startDrag,dragEnterEvent和dropEvent方法。startDrag方法创建了一个QMimeData对象并存储要拖动的数据。dragEnterEvent方法检查拖动的数据是否与目标兼容,并在兼容的情况下接受拖放操作。dropEvent方法将项目添加到目标QTreeWidget中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值