我想在项目内部进行拖放功能。我在其中有一个列表小部件为(缩略图)。而且,我想从缩略图中拖动图像并将图像拖放为(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();
}
}
任何帮助对我都很有用。 预先谢谢你
答案 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上找到。