QT将图像从缩略图拖放到网格布局(QVTKOpenGLWidget)?

时间:2018-08-22 12:10:56

标签: c++ qt drag-and-drop

我想在项目内部进行拖放功能。我在其中有一个列表小部件为(缩略图)。而且,我想从缩略图中拖动图像并将图像拖放为(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();
    }
}

任何帮助对我都很有用。 预先谢谢你

1 个答案:

答案 0 :(得分:1)

原因

您正在重新实现 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上找到。