QT自定义拖放_图片的移动

定义拖放操作案例---在应用程序主窗口里面拖动图片显示到任意位置如下几步骤:

  1. 鼠标按下事件

    1. 获取图片
    2. 自定义MIME类型
    3. 将数据放入QMimeData
    4. QMimeData数据放入QDrag
    5. 给原图片添加阴影
    6. 执行放下操作
  2. 拖动进入事件
  3. 拖动事件
  4. 放下事件
  5. 这个例子是对图片进行移动,如果想对图片进行复制,则只需要将dragEnterEvent( )、dragMoveEvent( )、dropEvent( )这三个函数中的event->setDropAction( )函数中的参数改为Qt::CopyAction即可。
  6. 对于拖放操作的其他应用,比如根据移动的距离判断是否开始一个拖放操作,还有剪贴板QClipboard类,都可以在帮助中通过Drag and Drop关键字查看。
  7. 对于mousePressEvent( )中第6步的QDrag类的exec( )函数,它不会影响主事件循环,所以这时界面不会被冻结。
    这个函数设置了支持复制和移动动作,设置复制为默认放下动作。
    exec( )函数的返回类型由dropEvent( )中的设置决定。
    这里判断了到底进行了什么操作,如果是移动操作,那么就删除原来的图片;如果是复制操作,就恢复原来的图片

    #ifndef MAINWINDOW_PIC_MOVE_H
    #define MAINWINDOW_PIC_MOVE_H#include <QMainWindow>QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow_pic_move; }
    QT_END_NAMESPACEclass MainWindow_pic_move : public QMainWindow
    {Q_OBJECTpublic:MainWindow_pic_move(QWidget *parent = nullptr);~MainWindow_pic_move();private:Ui::MainWindow_pic_move *ui;
    protected:void mousePressEvent(QMouseEvent *event);//鼠标按下事件void dragEnterEvent(QDragEnterEvent *event);//拖入事件void dragMoveEvent(QDragMoveEvent *event);//拖动事件void dropEvent(QDropEvent *event);//释放事件,放下事件
    };
    #endif // MAINWINDOW_PIC_MOVE_H
    
    #include "mainwindow_pic_move.h"
    #include "ui_mainwindow_pic_move.h"
    #include <QLabel>
    #include <QMouseEvent>
    #include <QDragEnterEvent>
    #include <QDragMoveEvent>
    #include <QDropEvent>
    #include <QPainter>
    #include <QMimeData>
    #include <QDrag>
    //QT自定义拖放MainWindow_pic_move::MainWindow_pic_move(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow_pic_move)
    {ui->setupUi(this);setAcceptDrops(true);QLabel *q_lable=new QLabel(this);//QPixmap q_pixmap("../xx/xx.png");QPixmap q_pixmap("../src5_8/荷花1.jpg");q_lable->setPixmap(q_pixmap);q_lable->resize(q_pixmap.size());//设置图片的大小作为标签的大小q_lable->move(100,100);q_lable->setAttribute(Qt::WA_DeleteOnClose);//关闭窗口销毁图片}MainWindow_pic_move::~MainWindow_pic_move()
    {delete ui;
    }void MainWindow_pic_move::mousePressEvent(QMouseEvent *event)
    {//1.获取图片//将鼠标指针所在位置的部件强制转换为Qlabel类型QLabel *child=static_cast<QLabel *>(childAt(event->pos()));if(!child->inherits("QLabel"))return;//部件不是QLabel直接返回QPixmap pix_map=*child->pixmap();//获取QLabel的图片//2自定义MIME类型QByteArray item_data;QDataStream data_stream(&item_data,QIODevice::WriteOnly);//创建数据流//将图片信息,位置信息输入到字节数组中data_stream<<pix_map<<QPoint(event->pos()-child->pos());//鼠标位置与标签位置之差//3将数据放入QMimeData中QMimeData *mime_data=new QMimeData;//创建QMimeData用来存放要移动的数据//将字节数组放入QMimeData中,这里的MIME类型是自己定义的mime_data->setData("myimage/png",item_data);//4将QMimeData数据放入QDrag中QDrag *drag=new QDrag(this);//创建QDrag,用来移动数据drag->setMimeData(mime_data);drag->setPixmap(pix_map);//在移动过程中显示图片,若不设置则默认显示一个小矩形drag->setHotSpot(event->pos()-child->pos());//拖动时鼠标指针的位置不变//5给原图片添加阴影QPixmap temp_pixmap=pix_map;//使原图片添加阴影QPainter painter2;painter2.begin(&temp_pixmap);//在图片的外接矩形中添加一层透明的淡黑色形成阴影效果painter2.fillRect(pix_map.rect(),QColor(127,127,127,127));painter2.end();child->setPixmap(temp_pixmap);//在移动图片过程中,让原图片添加一层黑色的阴影//6.执行拖放操作if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction)//设置拖放可以是移动和复制操作,默认是复制操作{child->close();//如果是移动操作,那么拖放 完成后关闭原标签}else{child->show();//如果是复制操作,那么拖放完成后显示标签图片child->setPixmap(pix_map);//显示原图片,不再使用阴影}}void MainWindow_pic_move::dragEnterEvent(QDragEnterEvent *event)
    {//拖动进入事件if(event->mimeData()->hasFormat("myimage/png"))//如果有我们定义的MIME类型数据,则进行移动操作{event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}
    }void MainWindow_pic_move::dragMoveEvent(QDragMoveEvent *event)//拖动事件
    {if(event->mimeData()->hasFormat("myimage/png")){event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}
    }void MainWindow_pic_move::dropEvent(QDropEvent *event)
    {if(event->mimeData()->hasFormat("myimage/png")){QByteArray item_data=event->mimeData()->data("myimage/png");QDataStream data_stream(&item_data,QIODevice::ReadOnly);QPixmap pix_map;QPoint offset;//使用数据流将字节数组中的数据读入到QPixmap和QPoint变量中data_stream>>pix_map>>offset;//新建标签,为其添加图片,并根据图片大小设置标签的大小QLabel *new_label =new QLabel(this);new_label->setPixmap(pix_map);new_label->resize(pix_map.size());//让图片移动到放下的位置,不设置的话,图片会默认显示在(0,0)点窗口左上角new_label->move(event->pos()-offset);new_label->show();new_label->setAttribute(Qt::WA_DeleteOnClose);event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();}
    }

QT自定义拖放_图片的移动相关推荐

  1. Qt实践3: 图片浏览器

    Qt实现图片浏览器 Qt实践3: 图片浏览器 引言 因课程教学,需要利用Qt做图形界面设计(GUI).自学Qt两月有余,发现现有很多资料,讲述C++程序设计QT项目的较多,不利于新手入门,特别是对于C ...

  2. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

  3. Qt中添加背景图片的方法

    Qt中添加背景图片的方法 QPalette的方法 #include #include int main(int argc, char *argv[]) { QApplication app(argc, ...

  4. QT自定义精美换肤界面

    QT自定义精美换肤界面 陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数 ...

  5. Qt键盘事件实现图片在窗口上下左右移动

    Qt键盘事件实现图片在窗口上下左右移动 标签(空格分隔): 键盘事件 一.项目内容: 新建桌面应用程序testKeyEvent,类名KeyEvent,基类QWidget,通过重写键盘事件到达操作的键盘 ...

  6. Qt 自定义信号与槽

    注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,//第二个参数信号,//第三个参数this是槽方法所属类的对象,且必 ...

  7. Android之自定义ViewPager实现图片的无线轮播

    PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...

  8. 微信自定义分享卡片链接的解决方案(可自定义标题 描述 图片)

    微信自定义分享卡片链接的解决方案(可自定义标题 描述 图片) 参考文章: (1)微信自定义分享卡片链接的解决方案(可自定义标题 描述 图片) (2)https://www.cnblogs.com/rg ...

  9. PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法,php/thinkphp实现微信分享自定义文字和图片...

    PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法, php/thinkphp实现微信分享自定义文字和图片. 一.先看微信JS-SDK文 ...

最新文章

  1. 论文图片误用?AI:这条路已被我堵死了
  2. 2019年,SD-WAN的回顾与展望
  3. [Vuex系列] - Vuex中的getter的用法
  4. postgresql c语言,PostgreSQL_C语言_开发者手册
  5. 有的人在25岁时就死了,但在75岁时才被埋葬:周鸿祎
  6. java merge into_Oracle merge into的使用
  7. android finish后不能ondestroy_Android面试基础(一)
  8. go语言 gosched
  9. 掌握SpringAOP
  10. php 上传图片并生成缩略图,php 上传图片并生成缩略图
  11. 47. Magneto Transaction Email(1)
  12. WM_CLOSE、WM_DESTROY、WM_QUIT区别
  13. 推荐一个Oracle数据库学习网站
  14. hadoop安装教程(一次填完所有的坑)
  15. 安卓网络测试工具_【网速】最佳手机网速测试工具
  16. lpad()函数oracle,oracle 中lpad的用法
  17. 3dMax 制作玻璃材质
  18. IDEA 出现错误:找不到或无法加载主类
  19. 阅读软件怎么添加书源_FANUC仿真软件怎么添加多个机器人到系统中
  20. node.js 不能识别?.问号点运算符

热门文章

  1. B. Phillip and Trains
  2. RationalDMIS2023平面度评价算法选择2023
  3. elementUI里的button使用disabled属性
  4. 数据恢复技巧:如何恢复已删除的手机短信
  5. Python简史:开发者的小小副业如何成为全球最热编程语言?
  6. 机器学习题5:请简述ID3算法的实现步骤,并利用ID3算法构建天气数据集的决策树模型,实现决策树的可视化。
  7. 白杨SEO:如何利用B站权重在百度搜索关键词排名进行精准引流?
  8. redis scan的使用方法
  9. PHP笔记(一):开发环境配置
  10. Gradle 依赖与 Plugin