【QTreeWidgetItem得item上下移动】

QTreeWidget属性

QTreeWidget具备节点拖动属性、同时其也可以限定拖动区域和范围。属性设置如下:

        this->setDragEnabled(true);  //开启拖拽
        this->setDragDropMode(QAbstractItemView::InternalMove);//限定拖拽在内部
        this->setDefaultDropAction(Qt::MoveAction);//设置移动模式
        this->setAcceptDrops(true);
        this->setMouseTracking(true);

item移动

利用QTreeWidget属性设置我们已经能够实现树下节点得移动、但是这些移动基本上无序的。若想实现固定节点下的item移动需要了解树得层级结构以及树得事件。

QTreeWidget事件

  1. dragEnterEvent(QDragEnterEvent *event);
    鼠标拖进事件
  2. dragMoveEvent(QDragMoveEvent *event);
    拖动事件
  3. dragLeaveEvent(QDragLeaveEvent *event);
    释放事件
  4. dropEvent(QDropEvent *event)
    拖放事件

功能实现

对于节点得拖动更多的使用场景是想通过拖动实现某一功能,再次我们将实现再某一节点下得item可以通过拖动实现排序而且仅限于当前节点下。

重写dropEvent(QDropEvent *event)

重写目的在于找到我们拖放得item是节点中的那个、需要确定他的位置。这里用到了QDragMoveEvent事件、利用鼠标坐标寻找Mytree当前坐标得item。

void MyTree::dropEvent(QDropEvent *event)
{
		QDragMoveEvent *mouseEvent = (QDragMoveEvent*)event;
        QTreeWidgetItem *item = Mytree->itemAt(mouseEvent->pos());
        if(item == nullptr) {
            qInfo("[%s] -- n_EventType_Move == nullptr");
            return false;
        }
        STRCT_TreeItemInfo strctTreeItemInfo;
        strctTreeItemInfo = item->data(colItem, Qt::UserRole).value<STRCT_TreeItemInfo>();
        //return false 就可以自主控制插入顺序了
        return AllDropTop(item);
}

在这里需要注意、如果你不介意拖动的item释放到其他item得上方或者下方。dropEvent事件可以返回true,如果该事件返回false。则无法拖动成功。
在这里我们想限定他的拖动规则、只想拖动以后item永远插入到其他item得上方。需要其他功能实现。

AllDropTop

bool Mytree::AllDropTop(QTreeWidgetItem *item)
{
	//处理拖动前和拖动后是否还在同一节点下。就需要比较前后父级是否还是同一个。
    QTreeWidgetItem* qCurent =  Mytree->currentItem()->parent();
    QTreeWidgetItem* parentItem = item->parent();
    if(qCurent == parentItem) {
        //删除该节点下移动item得源数据
        qCurent->removeChild(qCurent1);
        //得到移动后的位置
        int index = qCurent->indexOfChild(item);
        //再移动后的位置上插入原来的数据
        qCurent->insertChild(index, qCurent1);
        return false;
    } else {
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用QTreeWidget的insertTopLevelItem()和takeTopLevelItem()方法来实现QTreeWidgetItem的上下移动。具体步骤如下: 1. 获取当前选中的QTreeWidgetItem对象。 2. 判断当前选中的QTreeWidgetItem对象是否为顶级项目(即没有父项目),如果不是,则不能进行上下移动。 3. 获取当前选中的QTreeWidgetItem对象在QTreeWidget中的索引。 4. 如果要将当前选中的QTreeWidgetItem对象向上移动,则将其从QTreeWidget中取出,并将其插入到索引值减1的位置。 5. 如果要将当前选中的QTreeWidgetItem对象向下移动,则将其从QTreeWidget中取出,并将其插入到索引值加1的位置。 示例代码如下: ``` # 获取当前选中的QTreeWidgetItem对象 selected_item = self.treeWidget.currentItem() # 判断当前选中的QTreeWidgetItem对象是否为顶级项目 if selected_item.parent() is None: # 获取当前选中的QTreeWidgetItem对象在QTreeWidget中的索引 index = self.treeWidget.indexOfTopLevelItem(selected_item) # 如果要将当前选中的QTreeWidgetItem对象向上移动 if direction == 'up': # 将其从QTreeWidget中取出 item = self.treeWidget.takeTopLevelItem(index) # 将其插入到索引值减1的位置 self.treeWidget.insertTopLevelItem(index - 1, item) # 如果要将当前选中的QTreeWidgetItem对象向下移动 elif direction == 'down': # 将其从QTreeWidget中取出 item = self.treeWidget.takeTopLevelItem(index) # 将其插入到索引值加1的位置 self.treeWidget.insertTopLevelItem(index + 1, item) ``` 注意:在实际使用中,需要根据具体情况进行修改和适配。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值