#include "widget.h"Widget::Widget():BigButton("放大",this),LittleButton("缩小",this),LiftButton("向左",this),RightButton("向右",this),UpButton("向上",this),DownButton("向下",this),Paint(10,10,810,810),Alloffset(0,0),label("100%",this)
{ratio=1.0;             //初始化图片缩放比例action= Widget::None;pixW =985;            //设置图片尺寸为985*740pixH=740;pix =new QPixmap;pix->load(":/pic/img.jpg");BigButton.setGeometry(822,10,60,25);connect(&BigButton,SIGNAL(clicked()),this,SLOT(onBigClicked()));LittleButton.setGeometry(822,40,60,25);connect(&LittleButton,SIGNAL(clicked()),this,SLOT(onLittleClicked()));LiftButton.setGeometry(822,70,60,25);connect(&LiftButton,SIGNAL(clicked()),this,SLOT(OnLiftClicked()));RightButton.setGeometry(822,100,60,25);connect(&RightButton,SIGNAL(clicked()),this,SLOT(OnRightClicked()));UpButton.setGeometry(822,130,60,25);connect(&UpButton,SIGNAL(clicked()),this,SLOT(onUpClicked()));DownButton.setGeometry(822,160,60,25);connect(&DownButton,SIGNAL(clicked()),this,SLOT(onDownClicked()));label.move(840,200);resize(890,850);}bool Widget::event(QEvent * event)
{static bool press=false;static QPoint PreDot;if(event->type()== QEvent::MouseButtonPress ){QMouseEvent *mouse=dynamic_cast<QMouseEvent* >(event);//判断鼠标是否是左键按下,且鼠标位置是否在绘画区域if(mouse->button()==Qt::LeftButton &&Paint.contains(mouse->pos())){press=true;QApplication::setOverrideCursor(Qt::OpenHandCursor); //设置鼠标样式PreDot =mouse->pos();}}
else if(event->type()== QEvent::MouseButtonRelease)
{QMouseEvent *mouse=dynamic_cast<QMouseEvent* >(event);//判断鼠标是否是左键释放,且之前是在绘画区域if(mouse->button()==Qt::LeftButton && press ){QApplication::setOverrideCursor(Qt::ArrowCursor); //改回鼠标样式press=false;}
}if(event->type()==QEvent::MouseMove)              //移动图片{if(press){QMouseEvent *mouse=dynamic_cast<QMouseEvent* >(event);offset.setX(mouse->x() - PreDot.x());offset.setY(mouse->y() - PreDot.y());PreDot =mouse->pos();action = Widget::Move;this->update();}}
return QWidget::event(event);
}void Widget::wheelEvent(QWheelEvent* event)     //鼠标滑轮事件
{if (event->delta()>0) {      //上滑,缩小action=Widget::Shrink;this->update();} else {                    //下滑,放大action=Widget::Amplification;this->update();}event->accept();
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);int NowW=ratio *pixW;int NowH=ratio *pixH;if(action==Widget::Amplification)           //缩小
{ratio-=0.1*ratio;if(ratio<0.018)ratio =0.01;QString str;str.sprintf("%.0f%",ratio*100);label.setText(str) ;
}
else  if(action==Widget::Shrink)           //放大
{ratio+=0.1*ratio;if(ratio>4.5)ratio =5.000;QString str;str.sprintf("%.0f%",ratio*100);label.setText(str);
}
if(action==Widget::Amplification || action==Widget::Shrink)      //更新图片
{NowW =ratio *pixW;NowH =ratio *pixH;pix->load(":/pic/img.jpg");                 //重新装载,因为之前的图片已经被缩放过*pix=pix->scaled(NowW, NowH,Qt::KeepAspectRatio);action=Widget::None;}if(action==Widget::Move)                    //移动
{int offsetx=Alloffset.x()+offset.x();Alloffset.setX(offsetx);int offsety=Alloffset.y()+offset.y();Alloffset.setY(offsety);action=Widget::None;
}if(abs(Alloffset.x())>=(Paint.width()/2 + NowW/2 -10))    //限制X偏移值
{if(Alloffset.x()>0)Alloffset.setX(Paint.width()/2 + NowW/2 -10);elseAlloffset.setX(-Paint.width()/2 + -NowW/2 +10);
}
if(abs(Alloffset.y())>=(Paint.height()/2 + NowH/2 -10))    //限制Y偏移值
{if(Alloffset.y()>0)Alloffset.setY(Paint.height()/2 + NowH/2 -10);elseAlloffset.setY(-Paint.height()/2 + -NowH/2 +10);}int x=Paint.width()/2 + Alloffset.x() -NowW/2;
if(x<0)x=0;int y=Paint.height()/2 + Alloffset.y() -NowH/2;
if(y<0)y=0;int  sx=NowW/2 - Paint.width()/2 - Alloffset.x();
if(sx<0)sx=0;int  sy=NowH/2 - Paint.height()/2 - Alloffset.y();
if(sy<0)sy=0;int w=(NowW - sx)>Paint.width()? Paint.width() : (NowW - sx);
if(w>(Paint.width()-x))w =Paint.width()-x;int h=(NowH - sy)>Paint.height()? Paint.height() : (NowH - sy);
if(h>(Paint.height()-y))h =Paint.height()-y;painter.drawRect(Paint.x()-1,Paint.y()-1,Paint.width()+1,Paint.height()+1); //画框painter.drawTiledPixmap(x+Paint.x(),y+Paint.y(),w,h,*pix,sx,sy);             //绘画图形
}void  Widget::onLittleClicked()
{action=Widget::Amplification;this->update();
}void  Widget::onBigClicked()
{action=Widget::Shrink;this->update();
}
void Widget::onUpClicked()
{action=Widget::Move;offset.setX(0);offset.setY(-20);this->update();
}
void Widget::onDownClicked()
{action=Widget::Move;offset.setX(0);offset.setY(20);this->update();
}
void Widget::OnLiftClicked()
{action=Widget::Move;offset.setX(-20);offset.setY(0);this->update();
}
void Widget::OnRightClicked()
{action=Widget::Move;offset.setX(20) ;offset.setY(0) ;this->update();
}

文章来源:https://www.cnblogs.com/lifexy/p/9057046.html

转载于:https://www.cnblogs.com/xiongjim/p/9673943.html

20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)相关推荐

  1. VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放、移动图片

    VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放.移动图片 效果展示 界面设计 代码例程 完整代码 CMyLabel.h CMyLabel.cpp BrowsePic.h BrowsePi ...

  2. 安卓开发仿微信图片拖拽_Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)...

    [实例简介] Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动) [实例截图] [核心代码] ImageDemo-2014-02-18 └── ImageDemo-2014-02-18 ├ ...

  3. android xml图片缩放,Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码...

    概述:通过自定义ImageView控件,在xml布局里面调用自定的组件实现图片的缩放. /** * 自定义的ImageView控制,可对图片进行多点触控缩放和拖动 * * @author qiuwan ...

  4. js截取图片 裁剪图片之cropper.js插件用法详解

    js截取图片 裁剪图片之cropper.js插件用法详解 源码:https://github.com/fengyuanchen/cropper 引入+使用 <link href="/p ...

  5. QT快速入门、三点求圆心实现详解

    在编程中,会经常用到数学计算,所以C++将常用的数学计算,例如求正余弦等,封装成函数(正是我们在3.2 数学计算中学习到的),我们只需要写入简单的语句就可以执行所需要的功能,这正是函数的意义.在这一章 ...

  6. HTML5 多图片上传(前端+后台详解)

    HTML5 多图片上传(前端+后台详解) 1.参考jquery插件库 2.修改代码 3.添加的后台代码 4.删除的后台代码 1.参考jquery插件库 手机端实现多图片上传 2.修改代码 我发现他这里 ...

  7. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

    文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...

  8. Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解、插件。

    Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解.插件. **应用场景:**在很多时候,前端开发过程中需要动态的获取图片的主要的颜色值,并根据主色调去调整主题样式的颜色或者模拟 ...

  9. 50.深度解密五十:裂变营销(图片营销)中”图片制作”奥秘详解

    网络营销推广技术.技巧深度解密(五十)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解图片营销中的图片制作奥秘的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬 ...

  10. python公众号留言功能详情_Python实现的微信公众号群发图片与文本消息功能实例详解...

    本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...

最新文章

  1. Linux内核之时间系统
  2. 洛谷1522牛的旅行
  3. javascript option 菜单图标_MacBook上神奇的Option键
  4. python常用的装饰器有哪些_python基本装饰器
  5. Unity Shaders and Effects Cookbook (3-4) 使用高光贴图
  6. call mysql_connect_Call to undefined function mysql_connect()
  7. jroo,已开源,一个java web快速开发工具
  8. python中unitest_基于Python的unitest框架介绍
  9. C语言易错知识点总结
  10. 图解MongoChef的安装步骤
  11. 火焰检测方法和数据集记录
  12. ArcCatalog导出数据库中shapefile
  13. 【解决】 io.lettuce.core.RedisCommandExecutionException: ERR wrong number of arguments for 'set' command
  14. 腾讯云与本地主机socket通信网络问题
  15. SEO入门:网站站内优化流程
  16. Origin画图标签常见语法
  17. 微信小程序退出按钮退出方式
  18. js实现金额的大写转小写
  19. Java创建二维三维数组的几种方式
  20. 【C语言循环结构题目】在屏幕上打印n行*号倒三角形(此处n为6)

热门文章

  1. 系统学习NLP(二十七)--EMLo
  2. 电脑太慢了最简单的办法怎么弄_修电脑不求人—最实用办公室电脑故障及解决办法,办公室人都说好...
  3. java认证考试题库看不懂_一道JAVA认证考试试题,有点想不通,各位看看...
  4. PAT (Basic Level) Practice1029 旧键盘
  5. ubnutu更换合适源(阿里源)
  6. PTA-基础编程题目集-7-2 然后是几点
  7. git 基础用法梳理
  8. 图论--最小生成树总结(PrimKruskal)
  9. iOS·Charts·集成步骤
  10. 批量 // 注释替换为 /*的注释