QTreeWidget通过拖拽item调整item顺序

这篇博客介绍了如何在Qt环境中启用QTreeWidget的拖放功能,允许内部移动项目,并关闭特定QTreeWidgetItem的Drop功能,从而实现不修改代码调整item顺序的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 设置QTreeWidget:
treeWidget->setDragEnabled(true);//开启拖拽功能
treeWidget->setDragDropMode(QAbstractItemView::InternalMove);//设置控件内部移动
treeWidget->setDefaultDropAction(Qt::MoveAction);//设置移动模式

2 设置QTreeWidgetItem关闭Drop功能
QTreeWidgetItem* pChild = new QTreeWidgetItem();
pChild->setFlags(pChild->flags() & ~Qt::ItemIsDropEnabled);//关闭item的Drop功能。

       通过以上设置,可不用修改代码,实现移动item顺序功能。
### Qt QTreeWidget 实现 Drag and Drop 移动 Item 示例 为了实现在 `QTreeWidget` 中通过拖拽来移动项的功能,可以基于给定的代码片段进行扩展。下面是一个完整的示例程序,展示了如何设置并实现这一特性。 #### 创建可拖拽的树形组件 首先定义一个新的类 `DragTreeWidget` 继承自 `QTreeWidget` 并重写必要的虚函数: ```cpp #pragma once #include <QTreeWidget> class QMouseEvent; class QTreeWidgetItem; class DragTreeWidget : public QTreeWidget { Q_OBJECT public: explicit DragTreeWidget(QWidget *parent = nullptr); ~DragTreeWidget(); private slots: void handleItemChanged(QTreeWidgetItem* current, int column); protected: void mousePressEvent(QMouseEvent *event) override; void startDrag(Qt::DropActions supportedActions) override; private: void init(); }; ``` 在构造函数中初始化一些属性,并开启拖放功能: ```cpp #include "dragtreewidget.h" DragTreeWidget::DragTreeWidget(QWidget *parent) : QTreeWidget(parent), _selectItem(nullptr){ setAcceptDrops(true); // 接受来自其他窗口部件的数据 setDragEnabled(true); // 启用内部拖曳操作 viewport()->setAcceptDrops(true);// 设置视图接受drop事件 setDefaultDropAction(Qt::MoveAction); // 默认动作设为move } void DragTreeWidget::init(){ // 初始化逻辑... } ``` 当用户点击某个项目时记录选中的项以便后续处理: ```cpp void DragTreeWidget::mousePressEvent(QMouseEvent *event){ _selectItem = itemAt(event->pos()); if (_selectItem != nullptr && event->button() == Qt::LeftButton){ Q_EMIT currentItemChanged(_selectItem, currentIndex().column()); } QTreeWidget::mousePressEvent(event); } ``` 最后覆盖默认行为以允许跨不同层次结构间的拖拽转移: ```cpp void DragTreeWidget::startDrag(Qt::DropActions supportedActions){ if (!_selectItem || !selectedItems().size()) return ; QByteArray encodedData; QDataStream stream(&encodedData, QIODevice::WriteOnly); foreach(auto it, selectedItems()){ QString text = it->text(0); stream << text; } QMimeData *mimeData = new QMimeData; mimeData->setData("application/x-qabstractitemmodeldatalist", encodedData); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); auto result = drag->exec(supportedActions, Qt::CopyAction | Qt::MoveAction); if(result==Qt::IgnoreAction)return ; if (result == Qt::MoveAction){ delete takeTopLevelItem(indexOfTopLevelItem(_selectItem)); } } ``` 上述代码实现了基本的拖拽功能[^1]。对于更复杂的场景比如调整子项目的层级关系,则需进一步监听特定信号并在适当时候更新模型数据[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值