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


    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( )中的设置决定。
      这里判断了到底进行了什么操作,如果是移动操作,那么就删除原来的图片;如果是复制操作,就恢复原来的图片
      1. #ifndef MAINWINDOW_PIC_MOVE_H
      2. #define MAINWINDOW_PIC_MOVE_H
      3. #include
      4. QT_BEGIN_NAMESPACE
      5. namespace Ui { class MainWindow_pic_move; }
      6. QT_END_NAMESPACE
      7. class MainWindow_pic_move : public QMainWindow
      8. {
      9. Q_OBJECT
      10. public:
      11. MainWindow_pic_move(QWidget *parent = nullptr);
      12. ~MainWindow_pic_move();
      13. private:
      14. Ui::MainWindow_pic_move *ui;
      15. protected:
      16. void mousePressEvent(QMouseEvent *event);//鼠标按下事件
      17. void dragEnterEvent(QDragEnterEvent *event);//拖入事件
      18. void dragMoveEvent(QDragMoveEvent *event);//拖动事件
      19. void dropEvent(QDropEvent *event);//释放事件,放下事件
      20. };
      21. #endif // MAINWINDOW_PIC_MOVE_H
      1. #include "mainwindow_pic_move.h"
      2. #include "ui_mainwindow_pic_move.h"
      3. #include
      4. #include
      5. #include
      6. #include
      7. #include
      8. #include
      9. #include
      10. #include
      11. //QT自定义拖放
      12. MainWindow_pic_move::MainWindow_pic_move(QWidget *parent)
      13. : QMainWindow(parent)
      14. , ui(new Ui::MainWindow_pic_move)
      15. {
      16. ui->setupUi(this);
      17. setAcceptDrops(true);
      18. QLabel *q_lable=new QLabel(this);
      19. //QPixmap q_pixmap("../xx/xx.png");
      20. QPixmap q_pixmap("../src5_8/荷花1.jpg");
      21. q_lable->setPixmap(q_pixmap);
      22. q_lable->resize(q_pixmap.size());//设置图片的大小作为标签的大小
      23. q_lable->move(100,100);
      24. q_lable->setAttribute(Qt::WA_DeleteOnClose);//关闭窗口销毁图片
      25. }
      26. MainWindow_pic_move::~MainWindow_pic_move()
      27. {
      28. delete ui;
      29. }
      30. void MainWindow_pic_move::mousePressEvent(QMouseEvent *event)
      31. {
      32. //1.获取图片
      33. //将鼠标指针所在位置的部件强制转换为Qlabel类型
      34. QLabel *child=static_cast(childAt(event->pos()));
      35. if(!child->inherits("QLabel"))
      36. return;//部件不是QLabel直接返回
      37. QPixmap pix_map=*child->pixmap();//获取QLabel的图片
      38. //2自定义MIME类型
      39. QByteArray item_data;
      40. QDataStream data_stream(&item_data,QIODevice::WriteOnly);//创建数据流
      41. //将图片信息,位置信息输入到字节数组中
      42. data_stream<QPoint(event->pos()-child->pos());//鼠标位置与标签位置之差
      43. //3将数据放入QMimeData中
      44. QMimeData *mime_data=new QMimeData;//创建QMimeData用来存放要移动的数据
      45. //将字节数组放入QMimeData中,这里的MIME类型是自己定义的
      46. mime_data->setData("myimage/png",item_data);
      47. //4将QMimeData数据放入QDrag中
      48. QDrag *drag=new QDrag(this);//创建QDrag,用来移动数据
      49. drag->setMimeData(mime_data);
      50. drag->setPixmap(pix_map);//在移动过程中显示图片,若不设置则默认显示一个小矩形
      51. drag->setHotSpot(event->pos()-child->pos());//拖动时鼠标指针的位置不变
      52. //5给原图片添加阴影
      53. QPixmap temp_pixmap=pix_map;//使原图片添加阴影
      54. QPainter painter2;
      55. painter2.begin(&temp_pixmap);
      56. //在图片的外接矩形中添加一层透明的淡黑色形成阴影效果
      57. painter2.fillRect(pix_map.rect(),QColor(127,127,127,127));
      58. painter2.end();
      59. child->setPixmap(temp_pixmap);//在移动图片过程中,让原图片添加一层黑色的阴影
      60. //6.执行拖放操作
      61. if(drag->exec(Qt::CopyAction|Qt::MoveAction,Qt::CopyAction)==Qt::MoveAction)//设置拖放可以是移动和复制操作,默认是复制操作
      62. {
      63. child->close();//如果是移动操作,那么拖放 完成后关闭原标签
      64. }
      65. else
      66. {
      67. child->show();//如果是复制操作,那么拖放完成后显示标签图片
      68. child->setPixmap(pix_map);//显示原图片,不再使用阴影
      69. }
      70. }
      71. void MainWindow_pic_move::dragEnterEvent(QDragEnterEvent *event)
      72. {
      73. //拖动进入事件
      74. if(event->mimeData()->hasFormat("myimage/png"))//如果有我们定义的MIME类型数据,则进行移动操作
      75. {
      76. event->setDropAction(Qt::MoveAction);
      77. event->accept();
      78. }
      79. else
      80. {
      81. event->ignore();
      82. }
      83. }
      84. void MainWindow_pic_move::dragMoveEvent(QDragMoveEvent *event)//拖动事件
      85. {
      86. if(event->mimeData()->hasFormat("myimage/png"))
      87. {
      88. event->setDropAction(Qt::MoveAction);
      89. event->accept();
      90. }
      91. else
      92. {
      93. event->ignore();
      94. }
      95. }
      96. void MainWindow_pic_move::dropEvent(QDropEvent *event)
      97. {
      98. if(event->mimeData()->hasFormat("myimage/png"))
      99. {
      100. QByteArray item_data=event->mimeData()->data("myimage/png");
      101. QDataStream data_stream(&item_data,QIODevice::ReadOnly);
      102. QPixmap pix_map;
      103. QPoint offset;
      104. //使用数据流将字节数组中的数据读入到QPixmap和QPoint变量中
      105. data_stream>>pix_map>>offset;
      106. //新建标签,为其添加图片,并根据图片大小设置标签的大小
      107. QLabel *new_label =new QLabel(this);
      108. new_label->setPixmap(pix_map);
      109. new_label->resize(pix_map.size());
      110. //让图片移动到放下的位置,不设置的话,图片会默认显示在(0,0)点窗口左上角
      111. new_label->move(event->pos()-offset);
      112. new_label->show();
      113. new_label->setAttribute(Qt::WA_DeleteOnClose);
      114. event->setDropAction(Qt::MoveAction);
      115. event->accept();
      116. }
      117. else
      118. {
      119. event->ignore();
      120. }
      121. }

  • 相关阅读:
    qemu在ARM和X86平台上的运行机制分析
    java计算机毕业设计五金机电市场批发零售管理信息系统源程序+mysql+系统+lw文档+远程调试
    markdown语法整理
    移动Web第一天 1 字体图标 && 2 平面转换 && 3 渐变
    项目中如何配置 Maven 为国内源
    Unity - 踩坑日志 - 低版本线性颜色空间渲染异常的 “BUG”
    SOA:整车架构下一代的升级方向
    Kotlin学习笔记(八)协程简单概念与简单使用
    SQLite 入门教程
    网络协议:什么是网络分层的七四五
  • 原文地址:https://blog.csdn.net/txwtech/article/details/126683405