QMimeData的值是怎么传递的?
我看来看去,QMimeData都是临时声明的。
大家看看下面的代码:
//! [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); }}
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(); }}
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(); }}