首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

QMimeData的值是如何传递的

2012-03-22 
QMimeData的值是怎么传递的?我看来看去,QMimeData都是临时声明的。大家看看下面的代码:C/C++ code//! [1]vo

QMimeData的值是怎么传递的?
我看来看去,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等等,开始进入拖动

热点排行