Qt之QTreeWidget:1拖拽项⽬
Qt之 QTreeWidget:1 拖拽项⽬
QTreeWidget 的拖拽实现,⽐较简单,但过程是绕了点路的,按照常规的⽅法:⼦类化QTreeWidget、重写 Drag 和 Drop的相关事件、利⽤QMimeData,QDrag类来实现,功能虽然实现了,但是关闭程序是,有可能会出现异常,类似 指针被⼆次析构了⼀样。偶发性的错误,挺让我头疼。
牢骚过后,上⼲货。
⼀、官档
【 Model/View Programming 】主题中有这么⼀段,并试着翻译成中⽂,便于理解。
在便捷类中使⽤拖放功能
QListWidget、QTableWidget和QTreeWidget 中 项⽬ 默认配置了⼀组不同的标志。例如,每个QListWidgetItem或
QTreeWidgetItem最初都是 enabled 启⽤的、checkable 可检查的、selectable可选择的,并且可以⽤作拖放源;每个
QTableWidgetItem也可以编辑并⽤作拖放操作的⽬标。
通常需要在视图本⾝中设置相关属性启动对拖放的内置⽀持:
设置dragEnabled属性为true,启⽤项拖动功能
设置 viewport() 的acceptDrops属性设置为true,允许⽤户在视图中放置内部或外部的项
设置视图的showDropIndicator属性,向⽤户显⽰当前正在拖动的项以及放置的位置。
设置视图的 dragDropMode(QAbstractItemView::InternalMove),在视图中移动项⽬,
⼆、测试
上述内容还是⽐较容易理解的,那就看看实际效果呗。
#include<QtWidgets>
#include"../../DebugTools/DebugTool.h"
void init(QTreeWidget &w){
w.setHeaderLabels({"节点","内容"});
QList<QTreeWidgetItem *> list;
// 3 ⾏ 2列,每⾏2个⼦节点
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("⽗节点%1").arg(i));
item->setText(1,item->text(0));
for(int j =0; j <2;++j){
QTreeWidgetItem *child =new QTreeWidgetItem(item);
child->setFlags(Qt::ItemIsEditable | item->flags());
child->setText(0,QString("⼦节点%1-%2").arg(i).arg(j));
child->setText(1,child->text(0));
}
}
w.addTopLevelItems(list);
w.header()->setSectionsClickable(false);
w.setEditTriggers(QTreeWidget::DoubleClicked );
}
void setDragAndDrop(QTreeWidget &w){
qt viewportw.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();
();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论