其实如果是从外部拖东西进来只需要重写两个函数
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();
}
}