在Qt中可以使用QDrag 来拖动操作Graphics各个元素,以此实现方便的拖动操作。
我们可以从QGraphicsItem 重载 mousePressEvent 来做开始拖动的操作,比如
void Item::mousePressEvent(QGraphicsSceneMouseEvent *event){
Qt::MouseButtons btn = event->buttons();
if(btn == Qt::LeftButton){
QDrag* drag = new QDrag(this->scene());
QMimeData* data = new QMimeData();
drag->setMimeData(data);
QPixmap pixmap(":image.png");
QPainter painter(&pixmap);
drag->setPixmap(pixmap); //这里设置拖拽时跟随鼠标的图片
drag->setHotSpot(QPoint(15,15)); //设置跟随图片的中心点
drag->exec(); //开始拖拽, 释放拖拽执行下面代码
#ifdef Q_WS_WIN //linux系统中你不能删除drag,删除会由系统自动执行(自己调试得知,可能不正确)
delete drag;//注意 上面QMimeData* data这里也会一并删除
#endif
}
}
这样当我们鼠标按下这个Item时候 拖动就可以开始了
我们有了可以拖的,还必须有去接收这个拖拽的东西,因为只有定义了允许放东西的地方。你才能把东西放里面
于是我们重载另一QGraphicsItem 的dropEvent函数
void DragReceiverItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{
qDebug() << "drop event " ;
qDebug() << "pos = " << event->pos();
qDebug() << "scene pos = " << event->scenePos();
qDebug() << "screen pos = " << event->screenPos();
qDebug() << "mime data = " << event->mimeData();
}
可以看到 mimeData也会随着
QGraphicsSceneDragDropEvent传递过来,这样拖拽就可以传递一些我们自己的数据。
还有一点要注意,就是QGraphicsItem必须设置 accpetDrop 为true之后才能触发DropEvent等事件
然后我们还有很多地方可以定制,比如
void DragReceiverItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
qDebug() << "拖到 当前Item里面时";
}
void DragReceiverItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
qDebug() << "拖到当前item外面时";
}
void DragReceiverItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
qDebug() << "拖到当前item里面的移动时";
}
综上,我们拖拽操作的拖动方与接收方都定义好了,我们就可以方便的在Qt Graphics中使用拖拽操作了。
分享到:
相关推荐
Qt实战案例之利用QDrag实现拖拽拼图功能,可参考文章:https://blog.csdn.net/didi_ya/article/details/125959399
当我们需要从一个控件拖出数据时,可以创建一个`QDrag`对象,并设置其源控件、拖动的初始位置以及携带的数据。 在`03_easyDragDropExample`案例中,我们可能看到以下几个关键步骤: 1. **启动拖动操作**:当用户按...
当用户执行拖放操作时,`QDrag`对象会创建一个代表被拖动数据的图标,并在屏幕上跟随鼠标移动。`QDrag`类通常与`QMimeData`一起使用,后者用于存储拖动的数据,并提供了多种数据类型的支持。 实现自定义拖放操作的...
2. **创建QDrag对象**:接着,使用`QDrag`类来创建一个拖动操作实例,并将`QMimeData`对象作为参数传递。 ```cpp QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); ``` 3. **设置拖动的视觉效果*...
我们创建了一个QDrag对象,通过QMimeData传递按钮的信息,并在`mouseMoveEvent`中启动拖动操作。同时,我们也重写了`dragEnterEvent`和`dropEvent`来处理按钮的自我拖放。 在实际应用中,你可以根据需要扩展这些...
在本文中,我们将深入探讨如何使用Qt库来实现一个动态的拖拽垃圾箱。这个功能在许多GUI应用程序中都很常见,比如桌面环境或者文件管理器,它允许用户通过简单的拖放操作来处理文件。我们将主要关注`QDrag`、`...
当用户开始拖动一个对象时,我们可以创建一个QDrag对象,然后将其与要拖动的数据关联起来。这个数据通常是一个QMimeData对象,它包含了多种格式的数据,每种数据都有一个对应的MIME类型。 QMimeData是一个用于存储...
在这个函数里,你需要创建一个`QDrag`对象,设置其携带的数据(通过`QMimeData`),并启动拖放操作。 在`Test_drog`项目中,可能包含一个自定义控件,比如一个`QListView`或`QWidget`,通过上述步骤实现了拖放功能...
在创建`QDrag`对象时,通常会使用`start()`方法,并指定一个动作,如`Qt::MoveAction`,表示拖动操作完成后目标位置会接收数据。 `QDrop`类则是处理放置操作的一方。当一个`QDrag`对象被拖放到`QListWidget`或其他...
QDrag类代表了一个拖动操作,而QDropEvent则处理拖放事件。下面我们将详细讲解如何实现这个功能: 1. **启用拖放支持**: 首先,你需要在你的窗口类中启用拖放支持。这可以通过重载`setAcceptDrops(true)`来完成。...
在这个过程中,`QMimeData`对象作为`QDrag`的一部分被创建,它包含了要拖动的数据及其MIME类型。 以下是一个简单的示例,展示如何在拖放事件中使用`QClipboard::mimeData()`: ```cpp // 创建一个QMimeData对象,...
当鼠标按下时,你需要捕获这个事件,创建一个QDrag对象,并将要拖动的数据附加到其中。例如: ```cpp void MyWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton && !drag...
QDrag用于创建一个拖动对象,QMimeData用于存储拖动数据,而QDropEvent则用于处理目标区域接收到拖放事件时的行为。 **实现步骤:** 1. **启用拖放功能**:首先,你需要在你的控件类中启用拖放功能,通常是在构造...
3. **启动QDrag**:在`startDrag`方法中,使用QDrag构造函数创建一个拖动操作,并设置QMimeData和拖动动作(例如,Qt::CopyAction或Qt::MoveAction)。 4. **接收拖放目标**:在目标组件上设置`setAcceptDrops(true...
- `mouseMoveEvent(QMouseEvent *event)`: 当鼠标移动并且满足拖放条件时,你可以创建一个QDrag对象,附加数据(如图片),并启动拖放操作。 - `mouseReleaseEvent(QMouseEvent *event)`: 在释放鼠标按钮时,处理...
在IT领域,特别是图形用户界面(GUI)编程中,`Qt`是一个广泛使用的跨平台应用程序开发框架。这个压缩包文件"qt_img_drag_copy.zip"显然包含了一个关于如何在`Qt`环境中处理图像拖放和复制功能的示例。以下是相关的...
在该函数中,你可以创建一个`QDrag`对象,并设置其要携带的数据。例如,如果你想要拖放文本,可以使用`QMimeData`对象来存储数据: ```cpp void MyWidget::startDrag(Qt::DropActions supportedActions) { ...
`QDrag`是处理拖动操作的核心类,它负责创建一个拖动动作并管理相关的数据。`QDropEvent`则是在目标位置接收拖放事件的对象,用于处理数据的接收和放置行为。此外,`QMimeData`是存储拖动数据的容器,它可以包含多种...
- **启动拖放操作**:首先,你需要创建一个QDrag对象,并设置源对象(通常是QGraphicsView或QWidget)。通常会使用`start()`方法启动拖放操作,并传入合适的MIME类型,以标识拖放数据的类型。 ```cpp QDrag *drag ...
在Qt5中,使用 `QDrag` 进行拖放操作可能需要调整。比如,创建 `QDrag` 对象时,可能需要重新设置其源和目标,并正确处理数据。 6. **其他注意事项**: 除了上述变化,还有可能遇到其他API的更改或废弃,如信号和...