QMimeData的值是如何传递的
QMimeData的值是怎么传递的?
我看来看去,QMimeData都是临时声明的。
大家看看下面的代码:
------解决方案--------------------
drag->setMimeData(mimeData);
设给drag,drag执行的时候丢给event,然后dropEvent里就可以取了。
------解决方案--------------------
我也只是大概看了一下:
QDrag::exec()的时候,
调用到 manager->drag(this);
但是我居然没看到QDragManager::drag() 的实现,就没再往下跟了。
估计也就是 postEvent之类的吧。构造QDragEnterEvent等等,开始进入拖动
我看来看去,QMimeData都是临时声明的。
大家看看下面的代码:
- C/C++ code
//! [1] void DragWidget::mousePressEvent(QMouseEvent *event) { QLabel *child = static_cast<QLabel*>(childAt(event->pos())); if (!child) return; QPixmap pixmap = *child->pixmap(); QByteArray itemData; QDataStream dataStream(&itemData, QIODevice::WriteOnly); dataStream << pixmap << QPoint(event->pos() - child->pos()); //! [1] //! [2] QMimeData *mimeData = new QMimeData;//这里声明了一个QMimeData指针。 mimeData->setData("application/x-dnditemdata", itemData);//这里设置了format。 //! [2] //! [3] QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setPixmap(pixmap); drag->setHotSpot(event->pos() - child->pos()); //! [3] QPixmap tempPixmap = pixmap; QPainter painter; painter.begin(&tempPixmap); painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127)); painter.end(); child->setPixmap(tempPixmap); if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction) child->close(); else { child->show(); child->setPixmap(pixmap); } }
- C/C++ code
void DragWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("application/x-dnditemdata")) {//这里开始用了。 if (event->source() == this) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->acceptProposedAction(); } } else { event->ignore(); } }
- C/C++ code
void DragWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasFormat("application/x-dnditemdata")) {//这里开始用了。 QByteArray itemData = event->mimeData()->data("application/x-dnditemdata"); QDataStream dataStream(&itemData, QIODevice::ReadOnly); QPixmap pixmap; QPoint offset; dataStream >> pixmap >> offset; QLabel *newIcon = new QLabel(this); newIcon->setPixmap(pixmap); newIcon->move(event->pos() - offset); newIcon->show(); newIcon->setAttribute(Qt::WA_DeleteOnClose); if (event->source() == this) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->acceptProposedAction(); } } else { event->ignore(); } }
------解决方案--------------------
drag->setMimeData(mimeData);
设给drag,drag执行的时候丢给event,然后dropEvent里就可以取了。
------解决方案--------------------
我也只是大概看了一下:
QDrag::exec()的时候,
调用到 manager->drag(this);
但是我居然没看到QDragManager::drag() 的实现,就没再往下跟了。
估计也就是 postEvent之类的吧。构造QDragEnterEvent等等,开始进入拖动