`
wan_2004
  • 浏览: 140859 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

QDrag 使用一例

阅读更多

        在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实现拖拽拼图功能.zip

    Qt实战案例之利用QDrag实现拖拽拼图功能,可参考文章:https://blog.csdn.net/didi_ya/article/details/125959399

    QT拖放事件之四:自定义拖放操作-利用QDrag来拖动完成数据的传输-案例demo

    当我们需要从一个控件拖出数据时,可以创建一个`QDrag`对象,并设置其源控件、拖动的初始位置以及携带的数据。 在`03_easyDragDropExample`案例中,我们可能看到以下几个关键步骤: 1. **启动拖动操作**:当用户按...

    QT鼠标拖拽的实现及源码

    2. **创建QDrag对象**:接着,使用`QDrag`类来创建一个拖动操作实例,并将`QMimeData`对象作为参数传递。 ```cpp QDrag *drag = new QDrag(this); drag-&gt;setMimeData(mimeData); ``` 3. **设置拖动的视觉效果*...

    QT拖放事件之三:自定义拖放操作-利用QDrag来拖动完成数据的传输

    当用户执行拖放操作时,`QDrag`对象会创建一个代表被拖动数据的图标,并在屏幕上跟随鼠标移动。`QDrag`类通常与`QMimeData`一起使用,后者用于存储拖动的数据,并提供了多种数据类型的支持。 实现自定义拖放操作的...

    PyQt5实现拖放功能

    我们创建了一个QDrag对象,通过QMimeData传递按钮的信息,并在`mouseMoveEvent`中启动拖动操作。同时,我们也重写了`dragEnterEvent`和`dropEvent`来处理按钮的自我拖放。 在实际应用中,你可以根据需要扩展这些...

    qt 实现 动态 拖拽垃圾箱

    在本文中,我们将深入探讨如何使用Qt库来实现一个动态的拖拽垃圾箱。这个功能在许多GUI应用程序中都很常见,比如桌面环境或者文件管理器,它允许用户通过简单的拖放操作来处理文件。我们将主要关注`QDrag`、`...

    python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例

    当用户开始拖动一个对象时,我们可以创建一个QDrag对象,然后将其与要拖动的数据关联起来。这个数据通常是一个QMimeData对象,它包含了多种格式的数据,每种数据都有一个对应的MIME类型。 QMimeData是一个用于存储...

    Qt拖拽控件的使用,记录下来方便日后使用

    在这个函数里,你需要创建一个`QDrag`对象,设置其携带的数据(通过`QMimeData`),并启动拖放操作。 在`Test_drog`项目中,可能包含一个自定义控件,比如一个`QListView`或`QWidget`,通过上述步骤实现了拖放功能...

    QListWidget交换位置

    在创建`QDrag`对象时,通常会使用`start()`方法,并指定一个动作,如`Qt::MoveAction`,表示拖动操作完成后目标位置会接收数据。 `QDrop`类则是处理放置操作的一方。当一个`QDrag`对象被拖放到`QListWidget`或其他...

    DragAndDrop.zip

    QDrag类代表了一个拖动操作,而QDropEvent则处理拖放事件。下面我们将详细讲解如何实现这个功能: 1. **启用拖放支持**: 首先,你需要在你的窗口类中启用拖放支持。这可以通过重载`setAcceptDrops(true)`来完成。...

    QT拖放事件八:通过全局剪切板中的接口QClipboard::mimeData()来获取MIME类型数据

    在这个过程中,`QMimeData`对象作为`QDrag`的一部分被创建,它包含了要拖动的数据及其MIME类型。 以下是一个简单的示例,展示如何在拖放事件中使用`QClipboard::mimeData()`: ```cpp // 创建一个QMimeData对象,...

    qt实现拖放效果demo

    当鼠标按下时,你需要捕获这个事件,创建一个QDrag对象,并将要拖动的数据附加到其中。例如: ```cpp void MyWidget::mouseMoveEvent(QMouseEvent *event) { if (event-&gt;buttons() & Qt::LeftButton && !drag...

    DragDemo.zip

    QDrag用于创建一个拖动对象,QMimeData用于存储拖动数据,而QDropEvent则用于处理目标区域接收到拖放事件时的行为。 **实现步骤:** 1. **启用拖放功能**:首先,你需要在你的控件类中启用拖放功能,通常是在构造...

    projectchooser.rar

    3. **启动QDrag**:在`startDrag`方法中,使用QDrag构造函数创建一个拖动操作,并设置QMimeData和拖动动作(例如,Qt::CopyAction或Qt::MoveAction)。 4. **接收拖放目标**:在目标组件上设置`setAcceptDrops(true...

    鼠标图片拖放编程步骤QT版本

    - `mouseMoveEvent(QMouseEvent *event)`: 当鼠标移动并且满足拖放条件时,你可以创建一个QDrag对象,附加数据(如图片),并启动拖放操作。 - `mouseReleaseEvent(QMouseEvent *event)`: 在释放鼠标按钮时,处理...

    qt_img_drag_copy.zip

    在IT领域,特别是图形用户界面(GUI)编程中,`Qt`是一个广泛使用的跨平台应用程序开发框架。这个压缩包文件"qt_img_drag_copy.zip"显然包含了一个关于如何在`Qt`环境中处理图像拖放和复制功能的示例。以下是相关的...

    Qt拖放功能

    在该函数中,你可以创建一个`QDrag`对象,并设置其要携带的数据。例如,如果你想要拖放文本,可以使用`QMimeData`对象来存储数据: ```cpp void MyWidget::startDrag(Qt::DropActions supportedActions) { ...

    Qt Drag Drop之拖放.zip

    `QDrag`是处理拖动操作的核心类,它负责创建一个拖动动作并管理相关的数据。`QDropEvent`则是在目标位置接收拖放事件的对象,用于处理数据的接收和放置行为。此外,`QMimeData`是存储拖动数据的容器,它可以包含多种...

    qt-可拖拉软件框架设计

    - **启动拖放操作**:首先,你需要创建一个QDrag对象,并设置源对象(通常是QGraphicsView或QWidget)。通常会使用`start()`方法启动拖放操作,并传入合适的MIME类型,以标识拖放数据的类型。 ```cpp QDrag *drag ...

    qt4toqt5的变化

    在Qt5中,使用 `QDrag` 进行拖放操作可能需要调整。比如,创建 `QDrag` 对象时,可能需要重新设置其源和目标,并正确处理数据。 6. **其他注意事项**: 除了上述变化,还有可能遇到其他API的更改或废弃,如信号和...

Global site tag (gtag.js) - Google Analytics