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();
}