1. 程式人生 > >qt 實現label部件中的圖片隨滑鼠移動

qt 實現label部件中的圖片隨滑鼠移動

最近在做圖片檢視器,所以研究了一下這個東西!

首先給大家實現一下:

先在 .h 檔案定義四個函式:

voidmousePressEvent(QMouseEvent*event);//按下滑鼠
voiddragEnterEvent(QDragEnterEvent*event);//拖動進入
voiddragMoveEvent(QDragMoveEvent*event);//拖動
voiddropEvent(QDropEvent*event);//放下

函式實現:

voidMainWindow::mousePressEvent(QMouseEvent*event)//滑鼠按下事件
{
if(event->button()==Qt
::LeftButton)
{
//第一步,獲取圖片。將滑鼠位置的部件強制轉換為QLabel型
QLabel*child=static_cast<QLabel*>(childAt(event->pos()));
if(!child->inherits("QLabel"))
return;
QPixmappixmap=*child->pixmap();
//第二步,自定義MIME型別
QByteArrayitemData;
QDataStreamdataStream(&itemData,QIODevice::WriteOnly);
//將圖片資訊,位置資訊儲存到位元組陣列中
dataStream<<pixmap<<QPoint(event->pos()-child->pos());
//第三步,將資料放入QMimeData中
QMimeData*mimeData=newQMimeData;
mimeData->setData("myImage/jpg",itemData);
//第四步,將QMimelda中的資料放進QDrag
QDrag*drag=newQDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos()-child->pos());
//第五步,給原圖加陰影
QPixmaptempPixmap=pixmap;
QPainterpainter;//繪圖
painter.begin(&tempPixmap);
//新增透明淡黑色陰影
painter.fillRect(pixmap.rect(),QColor(127,127,127,127));
painter.end();
child->setPixmap(tempPixmap);
setAcceptDrops(true);
QLabel*label=newQLabel(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);
}
}
}
voidMainWindow::dragEnterEvent(QDragEnterEvent*event)//拖動進入事件
{
if(event->mimeData()->hasFormat("myImage/jpg"))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->ignore();
}
voidMainWindow::dragMoveEvent(QDragMoveEvent*event)//拖動事件
{
if(event->mimeData()->hasFormat("myImage/jpg"))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->ignore();
}
voidMainWindow::dropEvent(QDropEvent*event)//放下事件
{
if(event->mimeData()->hasFormat("myImage/jpg"))
{
QByteArrayitemData=event->mimeData()->data("myImage/jpg");
QDataStreamdataStream(&itemData,QIODevice::ReadOnly);
QPixmappixmap;
QPointoffset;
dataStream>>pixmap>>offset;//使用資料流將位元組資料讀到QPixmap,QPoint變數中
//新建標籤,為其新增圖片,並根據圖片大小設定標籤大小
QLabel*newLabel=newQLabel(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,希望多多指教!謝謝