QListWidget拖拽复制,拖拽移动到另外一个控件、拖拽至自己内部

博客主要介绍了QlistWidget可拖动属性的设置,包括是否展示拖拽项、是否支持拖动自己的项、拖拽模式(如不可拖拽不可接收、只能拖动等)以及拖放操作属性(如复制、移动等),还提及了QlistWidget可拖拽至自己序列的设置方法。

QListWidget拖拽复制,拖拽移动到另外一个控件

QlistWidget可拖动属性设置

在这里插入图片描述
如图:
红圈代表的是 是否展示拖拽项
篮圈代表的是 是否支持拖动自己的项
绿圈代表的是 拖拽的模式

在这里插入图片描述
图片中五个模式分别为: 不可拖拽不可接收、只能拖动、只能接收、可以接收拖动、内部移动
黑色圈代表拖放操作的属性
如 copyaction 是复制拖拽项, moveaction 是移动拖拽项等

在这里插入图片描述

QlistWidget可拖拽至自己的序列

使用以下设置即可
### 三级目录

Qt 中实现两个 `QListWidget` 之间的拖拽功能,主要依赖于 Qt 的拖放事件处理机制。具体实现步骤包括:启用拖拽支持、重写鼠标事件、创建拖拽对象、处理目标控件的拖入与放置事件。 ### 启用拖拽支持 首先,确保两个 `QListWidget` 控件都启用了拖拽和接受拖拽事件。可以分别调用以下方法: ```cpp listWidget1->setDragEnabled(true); listWidget2->setAcceptDrops(true); ``` ### 鼠标按下与拖动事件 在自定义的 `QListWidget` 子类中,重写 `mousePressEvent` 和 `mouseMoveEvent` 方法,记录鼠标按下的位置,并在移动一定距离后启动拖拽操作。 ```cpp void DragListWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { startPos = event->pos(); } QListWidget::mousePressEvent(event); } void DragListWidget::mouseMoveEvent(QMouseEvent *event) { if ((event->pos() - startPos).manhattanLength() < QApplication::startDragDistance()) { return; } QListWidgetItem *item = currentItem(); if (!item) { return; } QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(item->text()); drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } ``` ### 拖拽进入与放置事件 在目标 `QListWidget` 中,需要重写 `dragEnterEvent` 和 `dropEvent` 方法,以允许接受拖拽内容,并在释放时添加新项。 ```cpp void DragListWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void DragListWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasText()) { QString text = event->mimeData()->text(); new QListWidgetItem(text, this); event->acceptProposedAction(); } } ``` ### 完整示例 以下是完整的自定义 `QListWidget` 类实现,支持拖拽操作并接受其他 `QListWidget` 的拖拽内容: ```cpp #include <QListWidget> #include <QMouseEvent> #include <QDrag> #include <QMimeData> class DragListWidget : public QListWidget { Q_OBJECT public: explicit DragListWidget(QWidget *parent = nullptr) : QListWidget(parent) { setDragEnabled(true); setAcceptDrops(true); } protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { startPos = event->pos(); } QListWidget::mousePressEvent(event); } void mouseMoveEvent(QMouseEvent *event) override { if ((event->pos() - startPos).manhattanLength() < QApplication::startDragDistance()) { return; } QListWidgetItem *item = currentItem(); if (!item) { return; } QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(item->text()); drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } void dragEnterEvent(QDragEnterEvent *event) override { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void dropEvent(QDropEvent *event) override { if (event->mimeData()->hasText()) { QString text = event->mimeData()->text(); new QListWidgetItem(text, this); event->acceptProposedAction(); } } private: QPoint startPos; }; ``` ### 主窗口设置示例 在主窗口中创建两个 `DragListWidget` 实例,并设置初始内容: ```cpp #include <QApplication> #include <QVBoxLayout> #include "draglistwidget.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout *layout = new QVBoxLayout(&window); DragListWidget *list1 = new DragListWidget(&window); DragListWidget *list2 = new DragListWidget(&window); list1->addItems(QStringList() << "Item 1" << "Item 2" << "Item 3"); list2->addItems(QStringList() << "Item A" << "Item B" << "Item C"); layout->addWidget(list1); layout->addWidget(list2); window.setLayout(layout); window.show(); return app.exec(); } ``` ### 注意事项 - 拖拽操作中使用 `QMimeData` 来存储数据,可以支持多种格式(文本、URL、图像等)。 - 如果需要拖拽多个项目,可以将多个项的文本拼接后放入 `QMimeData` 中,并在目标控件中解析。 - 若需要支持跨应用程序拖拽,应使用更复杂的 `QMimeData` 格式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值