可对文本进行拖动到指定位置。
部分主要代码
- 当被鼠标拖动的对象进入其容器范围内时触发此事件
void DragWidget::dragEnterEvent(QDragEnterEvent *event){ if (event->mimeData()->hasText()) { if (event->source() == this) { event->setDropAction(Qt::MoveAction); event->accept(); /* 接受拖拽事件 */ } else { event->acceptProposedAction(); } } else { event->ignore(); }}
在一个拖动过程中,释放鼠标键时触发此事件
void DragWidget::dropEvent(QDropEvent *event){ if (event->mimeData()->hasText()) { const QMimeData *mime = event->mimeData(); QStringList pieces = mime->text().split(QRegularExpression(QStringLiteral("\\s+")), QString::SkipEmptyParts); QPoint position = event->pos(); QPoint hotSpot; QByteArrayList hotSpotPos = mime->data(hotSpotMimeDataKey()).split(' '); if (hotSpotPos.size() == 2) { /* 松开拖拽设置为当前位置 */ hotSpot.setX(hotSpotPos.first().toInt()); hotSpot.setY(hotSpotPos.last().toInt()); } for (const QString &piece : pieces) { QLabel *newLabel = createDragLabel(piece, this); newLabel->move(position - hotSpot); newLabel->show(); newLabel->setAttribute(Qt::WA_DeleteOnClose); position += QPoint(newLabel->width(), 0); } if (event->source() == this) { event->setDropAction(Qt::MoveAction); event->accept(); /* 接受拖拽事件 */ } else { event->acceptProposedAction(); } } else { event->ignore(); } for (QWidget *widget : findChildren<QWidget *>()) { if (!widget->isVisible()) widget->deleteLater(); }}
- 捕获鼠标按下事件
void DragWidget::mousePressEvent(QMouseEvent *event){ QLabel *child = qobject_cast<QLabel*>(childAt(event->pos())); if (!child) return; QPoint hotSpot = event->pos() - child->pos(); QMimeData *mimeData = new QMimeData; mimeData->setText(child->text()); mimeData->setData(hotSpotMimeDataKey(), QByteArray::number(hotSpot.x()) + ' ' + QByteArray::number(hotSpot.y())); qreal dpr = window()->windowHandle()->devicePixelRatio(); QPixmap pixmap(child->size() * dpr); pixmap.setDevicePixelRatio(dpr); child->render(&pixmap); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setPixmap(pixmap); drag->setHotSpot(hotSpot); Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction); if (dropAction == Qt::MoveAction) child->close();}
关于更多
- 在QtCreator软件可以找到:
- 或在以下Qt安装目录找到
C:\Qt\{你的Qt版本}\Examples\{你的Qt版本}\widgets\draganddrop\draggabletext
- 相关链接
https://doc.qt.io/qt-5/qtwidgets-draganddrop-draggabletext-example.html
- Qt君公众号后台回复『Qt示例』获取更多内容。