PDA

View Full Version : QGraphicsWidget drag&drop problem



DizL
20th October 2015, 13:09
I've got QMainWindow, QGraphicsScene, QPushButton.
The problem is drag&drop only works for QPushButtons which are in QMainWindow, not for QPushButtons in QGraphicsScene.
Any hints?
Maybe i should to something with QGraphicsProxyWidget and dragEnterEvent(QGraphicsSceneDragDropEvent * event), but how?

Here is my code:


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

QGraphicsScene* scene = new QGraphicsScene;
QGraphicsWidget *textEdit = scene->addWidget(new QTextEdit("textedit"));
QGraphicsWidget *pushButton1 = scene->addWidget(new QPushButton("pushbutton1"));
QGraphicsWidget *pushButton2 = scene->addWidget(new QPushButton("pushbutton2"));
QGraphicsWidget *pushButton3 = scene->addWidget(new myGraphicsWidget(0));
QGraphicsWidget *pushButton4 = scene->addWidget(new myGraphicsWidget(0));
pushButton4->setAcceptDrops(true);

QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);

layout->addItem(textEdit);
layout->addItem(pushButton1);
layout->addItem(pushButton2);
layout->addItem(pushButton3);
layout->addItem(pushButton4);

QGraphicsWidget *form = new QGraphicsWidget;
form->setLayout(layout);
scene->addItem(form);

QGraphicsView *view = new QGraphicsView(this);
view->setScene(scene);
view->setAcceptDrops(true);

QVBoxLayout* layoucik = new QVBoxLayout();
layoucik->addWidget(new myGraphicsWidget(0));
layoucik->addWidget(new myGraphicsWidget(0));
layoucik->addWidget(view);

QWidget* widget = new QWidget;
widget->setLayout(layoucik);

this->setCentralWidget(widget);
}

MainWindow::~MainWindow()
{
delete ui;
}


and


#include "mygraphicswidget.h"
#include <QDrag>
#include <QMimeData>


myGraphicsWidget::myGraphicsWidget(QWidget* parent) : QPushButton("test", parent)
{
setAcceptDrops(true);
}

void myGraphicsWidget::mousePressEvent(QMouseEvent *event)
{
QPoint hotSpot = event->pos();
QMimeData *mimeData = new QMimeData;
mimeData->setText("aaabbcc");

QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setHotSpot(hotSpot);

Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
}

void myGraphicsWidget::mouseMoveEvent(QMouseEvent *event)
{

}

void myGraphicsWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasText())
{
event->accept();
}
}


void myGraphicsWidget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasText())
{
this->setText("aaa"+event->mimeData()->text());
}
}

regards,
DizL