【问题标题】:QT drag and drop image from thumbnail to gridlayout (QVTKOpenGLWidget)?QT将图像从缩略图拖放到网格布局(QVTKOpenGLWidget)?
【发布时间】:2018-08-22 12:10:55
【问题描述】:

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

任何帮助对我来说都非常有用。 提前谢谢你

【问题讨论】:

  • 到目前为止你尝试过什么? Qt documentation 有许多拖放示例。
  • 我会尝试各种方法,例如 mousePressEvent(QMouseEvent *event)、mousePressEvent(QMouseEvent *event)、mouseMoveEvent(QMouseEvent *event)、dropEvent(QDropEvent *event)。但是,它不适合我
  • 首先,我将为所有 4 个视口启用(acceptDrop()) 方法。然后我将应用所有与拖放事件相关的方法。
  • 建议将描述 I will enable(acceptDrop()) 方法为所有 4 个视口... 使用代码而不是注释放入您的问题中。
  • @AmarKumar,从您的代码中我看到您重新实现了 MainWindow 的拖放事件。你不应该重新实现 QOpenGlWidget 的拖放事件吗?让我为你准备一个例子来说明我的意思。

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


【解决方案1】:

原因

您正在重新实现 主窗口 的拖放事件处理程序。然而,四个 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-&gt;accept(); 对于允许小部件接受放置事件很重要。

示例

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

完整代码可在GitHub获取。

【讨论】:

  • 我们需要为拖放创建单独的 .cpp 文件,或者我们可以在 mainwindow.cpp 文件中使用它。
  • @AmarKumar,是的,你需要继承 QOpenGLWidget 然后在那里处理事件。请参阅我刚刚发布的其他示例。
  • 当我尝试创建一个新文件时。我收到错误(QVTKOpenGlWidget 有其他使用)
  • @AmarKumar,当我尝试创建新文件时是什么意思?您的问题没有提到文件的创建。如果这对您有用,但您还有其他问题,请接受答案(如果您喜欢,请考虑投票)并就您遇到的下一个问题提出另一个问题。
  • 我将通过 github 链接并尝试在 Qt 中执行 all 模型。但是我在将图像加载到列表中时遇到了问题。名称显示但图片未上传。所以,我无法检查拖放是否有效。请检查一次。
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
相关资源
最近更新 更多