自定义拖放操作案例---在应用程序主窗口里面拖动图片显示到任意位置如下几步骤:
- 鼠标按下事件
- 获取图片
- 自定义MIME类型
- 将数据放入QMimeData中
- 将QMimeData数据放入QDrag中
- 给原图片添加阴影
- 执行放下操作
- 拖动进入事件
- 拖动事件
- 放下事件
{ ui->setupUi(this); setAcceptDrops(true);//设置窗口部件可以接收拖入 QLabel *label = new QLabel(this); QPixmap pix("../imagedragdrop12/111.png"); label->setPixmap(pix); label->resize(pix.size()); label->move(100,100); label->setAttribute(Qt::WA_DeleteOnClose);//当窗口关闭时销毁图片 } MainWindow::~MainWindow() { delete ui; } //鼠标按下事件 void MainWindow::mousePressEvent(QMouseEvent *event) { //(1)获取图片 //将鼠标指针所在位置的部件强制转换为QLabel类型 QLabel *child = static_cast<QLabel*>(childAt(event->pos())); if(!child->inherits("QLabel"))//如果部件不是QLabel则直接返回 return; QPixmap pixmap = *child->pixmap();//获取QLabel中的图片 //(2)自定义MIME类型 QByteArray itemData;//创建字节数组 QDataStream dataSteam(&itemData,QIODevice::WriteOnly);//创建数据流 //将图片信息,位置信息输入到字节数组中 dataSteam<<pixmap<<QPoint(event->pos()-child->pos()); //(3)将数据放入QMimeData中 QMimeData *mimeData = new QMimeData;//创建QMimeData用来存放要移动的数据 //将字节数组放入QMimeData中,这里的MIME类型是我们自己定义的 mimeData->setData("myimage/png",itemData); //(4)将QMimeData数据放入QDrag中 QDrag *drag = new QDrag(this);//创建QDrag,它用来移动数据 drag->setMimeData(mimeData); drag->setPixmap(pixmap);//在移动过程中显示图片,若不设置默认显示一个小矩形 drag->setHotSpot(event->pos()-child->pos());//拖动时鼠标指针的位置不变 //(5)给原图片添加阴影 QPixmap temPixmap = pixmap;//使原图片添加阴影 QPainter painter; //创建QPainter,用来绘制QPixmap painter.begin(&temPixmap); //在图片的外接矩形中添加一层透明的淡黑色形成阴影效果 painter.fillRect(pixmap.rect(),QColor(127,127,127,127)); painter.end(); //在移动图片过程中,让原图片添加一层黑色阴影 child->setPixmap(temPixmap); //(6)执行放下操作 if(drag->exec(Qt::CopyAction | Qt::MoveAction,Qt::CopyAction) == Qt::MoveAction) child->close(); else{ child->show(); child->setPixmap(pixmap);//显示原图片,不再使用阴影 } } //拖动进入事件 void MainWindow::dragEnterEvent(QDragEnterEvent *event) { //如果有我们定义的MIME类型数据,则进行移动操作 if(event->mimeData()->hasFormat("myimage/png")) { event->setDropAction(Qt::MoveAction); event->accept(); }else event->ignore(); } //拖动事件 void MainWindow::dragMoveEvent(QDragMoveEvent *event) { //如果有我们定义的MIME类型数据,则进行移动操作 if(event->mimeData()->hasFormat("myimage/png")) { event->setDropAction(Qt::MoveAction); event->accept(); }else event->ignore(); } //放下事件 void MainWindow::dropEvent(QDropEvent *event) { //如果有我们定义的MIME类型数据 if(event->mimeData()->hasFormat("myimage/png")) { QByteArray itemData = event->mimeData()->data("myimage/png"); QDataStream dataStream(&itemData,QIODevice::ReadOnly); QPixmap pixmap; QPoint offset; dataStream>>pixmap>>offset; //新建标签,为其添加图片,并根据图片大小设置标签的大小 QLabel *newLabel = new QLabel(this); newLabel->setPixmap(pixmap); newLabel->resize(pixmap.size()); //让图片移动到放下的位置,不设置的话,图片会默认在(0,0)点 newLabel->move(event->pos()-offset); newLabel->show(); newLabel->setAttribute(Qt::WA_DeleteOnClose); event->setDropAction(Qt::MoveAction); event->accept(); }else event->ignore(); }
375



被折叠的 条评论
为什么被折叠?



