QT自定义拖放_图片的移动
QT自定义拖放_图片的移动
定义拖放操作案例---在应用程序主窗口里面拖动图片显示到任意位置如下几步骤:
- 鼠标按下事件
- 获取图片
- 自定义MIME类型
- 将数据放入QMimeData中
- 将QMimeData数据放入QDrag中
- 给原图片添加阴影
- 执行放下操作
- 拖动进入事件
- 拖动事件
- 放下事件
- 这个例子是对图片进行移动,如果想对图片进行复制,则只需要将dragEnterEvent( )、dragMoveEvent( )、dropEvent( )这三个函数中的event->setDropAction( )函数中的参数改为Qt::CopyAction即可。
- 对于拖放操作的其他应用,比如根据移动的距离判断是否开始一个拖放操作,还有剪贴板QClipboard类,都可以在帮助中通过Drag and Drop关键字查看。
- 对于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自定义拖放_图片的移动相关推荐
- Qt实践3: 图片浏览器
Qt实现图片浏览器 Qt实践3: 图片浏览器 引言 因课程教学,需要利用Qt做图形界面设计(GUI).自学Qt两月有余,发现现有很多资料,讲述C++程序设计QT项目的较多,不利于新手入门,特别是对于C ...
- Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现
文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...
- Qt中添加背景图片的方法
Qt中添加背景图片的方法 QPalette的方法 #include #include int main(int argc, char *argv[]) { QApplication app(argc, ...
- QT自定义精美换肤界面
QT自定义精美换肤界面 陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数 ...
- Qt键盘事件实现图片在窗口上下左右移动
Qt键盘事件实现图片在窗口上下左右移动 标签(空格分隔): 键盘事件 一.项目内容: 新建桌面应用程序testKeyEvent,类名KeyEvent,基类QWidget,通过重写键盘事件到达操作的键盘 ...
- Qt 自定义信号与槽
注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,//第二个参数信号,//第三个参数this是槽方法所属类的对象,且必 ...
- Android之自定义ViewPager实现图片的无线轮播
PS:以前也写过关于图片轮播这一块的博客.不过写的很烂,并且很多情况没有考虑到(没有支持无线轮播,和手势点击事件).因此这里写一篇补上.也是当时太年轻了. 注:图片请放大后再看.否则看不清楚. 学习内 ...
- 微信自定义分享卡片链接的解决方案(可自定义标题 描述 图片)
微信自定义分享卡片链接的解决方案(可自定义标题 描述 图片) 参考文章: (1)微信自定义分享卡片链接的解决方案(可自定义标题 描述 图片) (2)https://www.cnblogs.com/rg ...
- PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法,php/thinkphp实现微信分享自定义文字和图片...
PHP---微信JS-SDK获取access_token/jsapi_ticket/signature权限签名算法, php/thinkphp实现微信分享自定义文字和图片. 一.先看微信JS-SDK文 ...
最新文章
- 论文图片误用?AI:这条路已被我堵死了
- 2019年,SD-WAN的回顾与展望
- [Vuex系列] - Vuex中的getter的用法
- postgresql c语言,PostgreSQL_C语言_开发者手册
- 有的人在25岁时就死了,但在75岁时才被埋葬:周鸿祎
- java merge into_Oracle merge into的使用
- android finish后不能ondestroy_Android面试基础(一)
- go语言 gosched
- 掌握SpringAOP
- php 上传图片并生成缩略图,php 上传图片并生成缩略图
- 47. Magneto Transaction Email(1)
- WM_CLOSE、WM_DESTROY、WM_QUIT区别
- 推荐一个Oracle数据库学习网站
- hadoop安装教程(一次填完所有的坑)
- 安卓网络测试工具_【网速】最佳手机网速测试工具
- lpad()函数oracle,oracle 中lpad的用法
- 3dMax 制作玻璃材质
- IDEA 出现错误:找不到或无法加载主类
- 阅读软件怎么添加书源_FANUC仿真软件怎么添加多个机器人到系统中
- node.js 不能识别?.问号点运算符