PDA

View Full Version : Drag and drop QTreeWidgetItem to QTableWidget



RomainGallard
8th October 2010, 16:20
Hi

I'm trying to drag a QTreeWidgetItem from a custom QTreeWidget into a QTableWidget.
My problem is that i always have the forbiden cursor when I'm on the QTableWidget, and I never received the "drop" event!

This is the code in my custom QTreeWidget


void QTreeWidgetDragDrop::mousePressEvent(QMouseEvent *event)
{
// Get current selection
QTreeWidgetItem *selectedItem = currentItem();

// If the selected Item exists
if (selectedItem)
{
// Create data
QMimeData *mimeData = new QMimeData();
mimeData->setText("hello");

// Create drag
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);

drag->exec(Qt::CopyAction);
}

QTreeWidget::mousePressEvent(event);
}


and this is the code I have in my custom QTableWidget

void QTableWidgetDragDrop::dragEnterEvent(QDragEnterEve nt *event)
{
qDebug() << "dragEnterEvent text: " << event->mimeData()->text();

// Allways accept at first
event->acceptProposedAction();

QTableWidget::dragEnterEvent(event);
}

And this is the function to catch the drop event

void QTableWidgetDragDrop::dropEvent(QDropEvent *event)
{
qDebug() << "enter in dropEvent";
}


I cannot drop my item because I have the forbiden cursor, I never see the sentence "enter in dropEvent" but I have in output

dragEnterEvent text: "hello"

In addition, I have put in my QTableWidget constructor:

this->setAcceptDrops(true);

Any idea ...?

totem
10th October 2010, 14:25
try to reimplement


QTableWidgetDragDrop::dragMoveEvent(...)

and accept event here too

ernie
10th October 2010, 14:47
can you try it in debug mode and check all events?

RomainGallard
11th October 2010, 08:41
I have already implemented dragMoveEvent, but I don't receive the event too...
I'll try to check events in debug mode, I have to learn how the debug mode works.

RomainGallard
11th October 2010, 08:50
The call of "QAbstractItemView::dragEnterEvent" (in the mother class) contains


if (d_func()->canDecode(event)) {
event->accept();
setState(DraggingState);
} else {
event->ignore();
}


But, I saw in debug that it always goes in "event->ignore();", I have to work on that point ...

=> http://doc.trolltech.com/4.2/model-view-model-subclassing.html part "Drag and Drop Support and MIME Type Handling"

RomainGallard
11th October 2010, 13:02
I figured out!
My problem was what I found: I didn't set a model, and I didn't put my data into the default model!
So I put my data into the default model, and now I can see all my events!
My next step is to create my own model!

(You can put this thread as resolved ;) )

Thanks for your help ;)



void QTreeWidgetDragDrop::mousePressEvent(QMouseEvent *event)
{
// Get current selection
QTreeWidgetItem *selectedItem = currentItem();

// If the selected Item exists
if (selectedItem)
{
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << "Hello";

QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-qabstractitemmodeldatalist", itemData);

// Create drag
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);


qDebug() << "mousePressEvent before exec";
drag->exec(Qt::CopyAction);
qDebug() << "mousePressEvent after exec";
}

QTreeWidget::mousePressEvent(event);
}