【Qt小白】QTreeWidget drag drop到两个item之间 且出现line indicator

qt小白花了一整天的时间,翻了网上无数中英文的帖子和博客,最终乱点了一下ui模式下的一个选项而解决了问题…

目标:

实现在一个qtreewidget里item可以自由移动:
1. 拖动到某两个item之间时,可以以top-level插入到这两个item之间;
2. 拖动到某个item上时,可以被当成这个item的孩子。


问题描述:

每次想要把一个节点插入到某两个item之间时,总是被当成其中一个item的孩子,无法以top-level插入到这两个item之间。


尝试过的方法:

1.setDropIndicatorShown(bool enable),但是还是只能提示item大小的长方形,无法显示两个item之间的线…
2. 重写dragMoveEvent,检查dropIndicatorPosition是否是aboveitem。发现在我的程序中aaa永远不会被输出…

void TreeWidgetFFlow::dragMoveEvent(QDragMoveEvent *e<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt的拖放功能(Drag and Drop)是一种常用的用户界面交互方式,可以实现将数据从一个控件拖动到另一个控件的操作。在Qt中,拖放操作通常涉及两个角色:拖动源(Drag Source)和拖放目标(Drop Target)。 要实现拖放功能,首先需要设置拖动源和拖放目标的属性。对于拖动源,你可以使用`setDragEnabled(true)`方法来启用拖动功能,并通过`setMimeData()`方法设置传输的数据。对于拖放目标,你可以使用`setAcceptDrops(true)`方法来接受拖放操作,并通过`dragEnterEvent()`、`dragMoveEvent()`和`dropEvent()`等事件处理函数来处理不同的拖放事件。 以下是一个简单的示例代码,演示了如何在Qt中实现基本的拖放功能: ```cpp // 拖动源 class DragLabel : public QLabel { public: DragLabel(const QString& text, QWidget* parent = nullptr) : QLabel(text, parent) { setAcceptDrops(false); setDragEnabled(true); } void mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { QDrag* drag = new QDrag(this); QMimeData* mimeData = new QMimeData; mimeData->setText(text()); drag->setMimeData(mimeData); drag->exec(Qt::CopyAction); } } }; // 拖放目标 class DropLabel : public QLabel { public: DropLabel(QWidget* parent = nullptr) : QLabel(parent) { setAcceptDrops(true); } void dragEnterEvent(QDragEnterEvent* event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void dragMoveEvent(QDragMoveEvent* event) { event->accept(); } void dropEvent(QDropEvent* event) { setText(event->mimeData()->text()); } }; // 主窗口 int main(int argc, char** argv) { QApplication app(argc, argv); QWidget window; QVBoxLayout layout(&window); DragLabel dragLabel("Drag me"); DropLabel dropLabel; layout.addWidget(&dragLabel); layout.addWidget(&dropLabel); window.show(); return app.exec(); } ``` 上述代码创建了一个拖动源(`DragLabel`)和一个拖放目标(`DropLabel`),拖动源是一个可拖动的标签,当鼠标左键按下时,开始拖动,并将文本数据传输给拖放目标。拖放目标是另一个标签,当拖动源进入其区域时,会接受并显示拖动的文本数据。 这只是一个简单的示例,你可以根据自己的需求进行更复杂的拖放操作,例如传输自定义数据类型、处理多个拖动源和拖放目标等。希望能对你有所帮助!如有更多问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值