其实如果是从外部拖东西进来只需要重写两个函数
virtual void dragEnterEvent ( QDragEnterEvent * event ); //允许什么可以拖进来 virtual void dropEvent ( QDropEvent * event ); //拖进来发生什么事
下面是拖图片进来的例子:
void MyLabel::dragEnterEvent( QDragEnterEvent * event ) // { if (event->mimeData()->hasUrls()) //判断接受DRAG的类型,图片,文件(夹)之类的为RULS类型 { event->accept(); } else event->ignore(); }
void MyLabel::dropEvent( QDropEvent * event ) { if (event->mimeData()->hasUrls()) //判断接受类型 { QList<QUrl> list = event->mimeData()->urls(); //获取路径 QString fileName = list[0].toLocalFile(); //因为是简单例子我们就取第一个(其实这里是一个路径集,如何处理自己写) int index = fileName.indexOf(".jpg",Qt::CaseInsensitive); //判断是.JPG格式的 if (index != -1 ) {
QLabel *labelTemp = new QLabel(this); labelTemp->setAttribute(Qt::WA_DeleteOnClose); labelTemp->setPixmap(QPixmap(fileName)); labelTemp->resize(100,100);
labelTemp->show(); //写这么多是为了和下面的合一起,如果只是测这个用下面注释的一行就行了 //this->setPixmap(QPixmap(fileName)); } event->accept(); } else { event->ignore(); } }
记得在构造函数里 this->setAcceptDrops(true);
如果是在WIDGET中拖到另一个也不是很难,多写两个函数:
virtual void mousePressEvent ( QMouseEvent * event ); //自定义DRAG类型,和发生DRAG行为
virtual void dragMoveEvent ( QDragMoveEvent * event ); //DRAG时发生的事
简单伤心下就可和上面的合一起.实现将图片从桌面拖入,再把图片 在两个窗口中拖动,(在MAIN里生成两个WIDGET就行了
void Drag::mousePressEvent( QMouseEvent * event ) { QLabel *child = static_cast<QLabel*>(childAt(event->pos())); if (!child) { return; } QPixmap pixmap = *child->pixmap(); QByteArray itemData; //定义QByteArray变量并向里面传数据 QDataStream dataStream(&itemData,QIODevice::WriteOnly); dataStream << pixmap; QMimeData *mimeData = new QMimeData; //定义MimeData类型并定义类型KEY mimeData->setData("appliction/x-dnditemdata",itemData); QDrag *drag = new QDrag(this); //定义一个DRAG行为,并把MimeData放进去 drag->setMimeData(mimeData); drag->setPixmap(pixmap); //设置拖DRAG时的图片 drag->setHotSpot(QPoint(drag->pixmap().width()/2,drag->pixmap().height()/2)); //图片位置 if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction) { child->close(); } else { child->show(); child->setPixmap(pixmap); } }
void Drag::dragMoveEvent( QDragMoveEvent * event ) //和DRAGENTER 大同小异 { if (event->mimeData()->hasFormat("appliction/x-dnditemdata")) //判断DRAG类型, { if (event->source() == this) //在自己里拖动自己,可设置特殊事件 { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->acceptProposedAction(); } } else { event->ignore(); } }