Hi everyone,
As this thread is not so old, I try to post a question regarding the drag'n'drop with a QGraphicsTextItem (on Qt 4.7).
I followed the Drag'n'drop Robot example to implement the drag'n'drop. But it seems that it does not work on QGraphicsTextItem. I subclassed the TextItem and implemented every useful method.
If I change my parent class to another GraphicsItem such as EllipseItem, the drag'n'drop works, if it's derived from QGraphicsObject (as QGraphicsTextItem does), it's no working. Actually it's just the dropEvent part which is not working at all. The rest is perfectly working. But Qt won't let me to drop (I always have an icon forbidding me to do so) and the program never enters dropEvent in my subclass.
Does someone have an idea regarding that problem?
{
//setFlag(QGraphicsItem::ItemIsSelectable);
//setFlag(QGraphicsItem::ItemSendsGeometryChanges);
setAcceptedMouseButtons(Qt::LeftButton);
setAcceptDrops(true);
setCursor(Qt::OpenHandCursor);
}
void NodeTreeItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
if(event->mimeData()->hasText())
{
event->setAccepted(true);
update();
dragOver = true;
}
else
event->setAccepted(false);
}
void NodeTreeItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
Q_UNUSED(event);
dragOver = false;
update();
}
void NodeTreeItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{
event->setAccepted(true);
qDebug() << "I dropped it";
dragOver = false;
update();
}
{
Q_UNUSED(event);
setCursor(Qt::ClosedHandCursor);
}
{
if (QLineF(event
->screenPos
(), event
->buttonDownScreenPos
(Qt
::LeftButton)) return;
}
mime->setText(this->toPlainText());
drag->setMimeData(mime);
drag->exec();
setCursor(Qt::OpenHandCursor);
}
{
Q_UNUSED(event);
setCursor(Qt::OpenHandCursor);
}
NodeTreeItem::NodeTreeItem(QGraphicsItem *parent, QGraphicsScene *scene)
:QGraphicsTextItem(parent, scene)
{
//setFlag(QGraphicsItem::ItemIsSelectable);
//setFlag(QGraphicsItem::ItemSendsGeometryChanges);
setAcceptedMouseButtons(Qt::LeftButton);
setAcceptDrops(true);
setCursor(Qt::OpenHandCursor);
}
void NodeTreeItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
if(event->mimeData()->hasText())
{
event->setAccepted(true);
update();
dragOver = true;
}
else
event->setAccepted(false);
}
void NodeTreeItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
Q_UNUSED(event);
dragOver = false;
update();
}
void NodeTreeItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{
event->setAccepted(true);
qDebug() << "I dropped it";
dragOver = false;
update();
}
void NodeTreeItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event);
setCursor(Qt::ClosedHandCursor);
}
void NodeTreeItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (QLineF(event->screenPos(), event->buttonDownScreenPos(Qt::LeftButton))
.length() < QApplication::startDragDistance()) {
return;
}
QDrag *drag = new QDrag(event->widget());
QMimeData *mime = new QMimeData;
mime->setText(this->toPlainText());
drag->setMimeData(mime);
drag->exec();
setCursor(Qt::OpenHandCursor);
}
void NodeTreeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Q_UNUSED(event);
setCursor(Qt::OpenHandCursor);
}
To copy to clipboard, switch view to plain text mode
Enabling ItemIsSelectable or ItemIsMovable does not solve the problem.
Thanks in advance
Added after 36 minutes:
Hi,
It's me again. I figured out the problem. Apparently you have to set the TextInteractionFlag (TextEditorInteraction) to allow the drop.
So problem solved.
Cheers
Bookmarks