首页 > 解决方案 > QT将图像从缩略图拖放到网格布局(QVTKOpenGLWidget)?

问题描述

我想在我的项目中执行拖放功能。我有一个列表小部件作为(缩略图)。而且,我想从缩略图中拖动图像并将图像作为(QVTKOpenGlWidget)拖放到网格布局中。我已经使用了这个代码。但不幸的是,我无法拖放。

代码:

void mainwindow::dragEnterEvent(QDragEnterEvent *e)
{
    if (e->mimeData()->hasFormat("application/x-dnditemdata")) {
        if (e->source() == this) {
            e->setDropAction(Qt::MoveAction);
            e->accept();
        }
        else {
            e->acceptProposedAction();
        }
    }
    else {
        e->ignore();
    }
}

void mainwindow::dragMoveEvent(QDragMoveEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
        if (event->source() == this) {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        }
        else {
            event->acceptProposedAction();
        }
    }
    else {
        event->ignore();
    }
}

void mainwindow::dropEvent(QDropEvent *e)
{

    if (e->mimeData()->hasFormat("application/x-dnditemdata")) {
        QByteArray itemData = e->mimeData()->data("application/x-dnditemdata");
        QDataStream dataStream(&itemData, QIODevice::ReadOnly);

        QPalette pixmap;
        QPoint offset;
        dataStream >> pixmap >> offset;

        this->ui->view1->setPalette(pixmap);
        this->ui->view1->move(e->pos() - offset);
        this->ui->view1->show();
        this->ui->view1->setAttribute(Qt::WA_DeleteOnClose);
        if (e->source() == this) {
            e->setDropAction(Qt::MoveAction);
            e->accept();
        }
        else {
            e->acceptProposedAction();
        }
    }
    else {
        e->ignore();
    }
}

任何帮助对我来说都非常有用。先感谢您

标签: c++qtdrag-and-drop

解决方案


原因

您正在重新实现mainwindow的拖放事件处理程序。然而,四个 OpenGL 小部件位于主窗口的顶部,因此不会为其生成拖放事件。

解决方案

我的解决方案是从QOpenGLWidget继承并重新实现其事件处理程序:

#include "OpenGlWidget.h"
#include <QDragEnterEvent>

OpenGlWidget::OpenGlWidget(QWidget *parent) :
    QOpenGLWidget(parent)
{
    setAcceptDrops(true);
}

void OpenGlWidget::dragEnterEvent(QDragEnterEvent *event)
{
    event->accept();
}

void OpenGlWidget::dropEvent(QDropEvent *event)
{
    // do something
}

注意: setAcceptDrops(true);并且event->accept();对于允许小部件接受放置事件很重要。

例子

根据您提供的任务描述,我为您做了一个示例。它允许将左侧QListWidget中的图标拖放到右侧网格布局中排列的四个 OpenGL 小部件之一上。拖放的图标随后会显示在相应的 OpenGL 小部件中。

完整代码可在GitHub 上获得。


推荐阅读