最近在做图片查看器,所以研究了一下这个东西!
首先给大家实现一下:
先在 .h 文件定义四个函数:
void mousePressEvent(QMouseEvent *event); //按下鼠标
void dragEnterEvent(QDragEnterEvent *event); //拖动进入
void dragMoveEvent(QDragMoveEvent *event); //拖动
void dropEvent(QDropEvent *event); //放下
函数实现:
void MainWindow::mousePressEvent(QMouseEvent *event) //鼠标按下事件
{
if(event->button() == Qt::LeftButton)
{
//第一步,获取图片。将鼠标位置的部件强制转换为QLabel型
QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if(!child->inherits("QLabel"))
return;
QPixmap pixmap = *child->pixmap();
//第二步,自定义MIME类型
QByteArray itemData;
QDataStream dataStream(&itemData,QIODevice::WriteOnly);
//将图片信息,位置信息保存到字节数组中
dataStream<<pixmap<<QPoint(event->pos() - child->pos());
//第三步,将数据放入QMimeData中
QMimeData *mimeData = new QMimeData;
mimeData->setData("myImage/jpg",itemData);
//第四步,将QMimelda中的数据放进QDrag
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - child->pos());
//第五步,给原图加阴影
QPixmap tempPixmap = pixmap;
QPainter painter; //绘图
painter.begin(&tempPixmap);
//添加透明淡黑色阴影
painter.fillRect(pixmap.rect(),QColor(127,127,127,127));
painter.end();
child->setPixmap(tempPixmap);
setAcceptDrops(true);
QLabel *label = new QLabel(this);
label->setPixmap(pix);
label->resize(pix.size());
//第六步,执行拖动操作
if(drag->exec(Qt::CopyAction | Qt::MoveAction,Qt::CopyAction) == Qt::MoveAction)
child->close();
else
{
child->show();
child->setPixmap(pixmap);
}
}
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event) //拖动进入事件
{
if(event->mimeData()->hasFormat("myImage/jpg"))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->ignore();
}
void MainWindow::dragMoveEvent(QDragMoveEvent *event) //拖动事件
{
if(event->mimeData()->hasFormat("myImage/jpg"))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->ignore();
}
void MainWindow::dropEvent(QDropEvent *event) //放下事件
{
if(event->mimeData()->hasFormat("myImage/jpg"))
{
QByteArray itemData = event->mimeData()->data("myImage/jpg");
QDataStream dataStream(&itemData,QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
dataStream>>pixmap>>offset; //使用数据流将字节数据读到QPixmap,QPoint变量中
//新建标签,为其添加图片,并根据图片大小设置标签大小
QLabel *newLabel = new QLabel(this);
newLabel->setPixmap(pixmap);
newLabel->resize(pixmap.size());
ui->label = newLabel; //其他所有操作只针对ui->label
//是图片移动到放下的位置,不设置会默认显示在(0,0)
newLabel->move(event->pos() - offset);
newLabel->show();
newLabel->setAttribute(Qt::WA_DeleteOnClose);
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->ignore();
}
ui->label = newLabel; //其他所有操作只针对ui->label
这条语句是因为我其他的操作都是对Mainwindow中label进行的,移动会新建label,所以要把新建的label赋给Mainwindow中的label。
因为技术有限,还存在一些bug,希望多多指教!谢谢