20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)
#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实现图片鼠标缩放,鼠标拖动示例(详解)相关推荐
- VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放、移动图片
VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放.移动图片 效果展示 界面设计 代码例程 完整代码 CMyLabel.h CMyLabel.cpp BrowsePic.h BrowsePi ...
- 安卓开发仿微信图片拖拽_Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)...
[实例简介] Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动) [实例截图] [核心代码] ImageDemo-2014-02-18 └── ImageDemo-2014-02-18 ├ ...
- android xml图片缩放,Android通过自定义ImageView控件实现图片的缩放和拖动的实现代码...
概述:通过自定义ImageView控件,在xml布局里面调用自定的组件实现图片的缩放. /** * 自定义的ImageView控制,可对图片进行多点触控缩放和拖动 * * @author qiuwan ...
- js截取图片 裁剪图片之cropper.js插件用法详解
js截取图片 裁剪图片之cropper.js插件用法详解 源码:https://github.com/fengyuanchen/cropper 引入+使用 <link href="/p ...
- QT快速入门、三点求圆心实现详解
在编程中,会经常用到数学计算,所以C++将常用的数学计算,例如求正余弦等,封装成函数(正是我们在3.2 数学计算中学习到的),我们只需要写入简单的语句就可以执行所需要的功能,这正是函数的意义.在这一章 ...
- HTML5 多图片上传(前端+后台详解)
HTML5 多图片上传(前端+后台详解) 1.参考jquery插件库 2.修改代码 3.添加的后台代码 4.删除的后台代码 1.参考jquery插件库 手机端实现多图片上传 2.修改代码 我发现他这里 ...
- java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...
- Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解、插件。
Js获取图片主色调,近似色,互补色,以及根据图片颜色获取主题配色方案详解.插件. **应用场景:**在很多时候,前端开发过程中需要动态的获取图片的主要的颜色值,并根据主色调去调整主题样式的颜色或者模拟 ...
- 50.深度解密五十:裂变营销(图片营销)中”图片制作”奥秘详解
网络营销推广技术.技巧深度解密(五十)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解图片营销中的图片制作奥秘的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬 ...
- python公众号留言功能详情_Python实现的微信公众号群发图片与文本消息功能实例详解...
本文实例讲述了Python实现的微信公众号群发图片与文本消息功能.分享给大家供大家参考,具体如下: 在微信公众号开发中,使用api都要附加access_token内容.因此,首先需要获取access_ ...
最新文章
- Linux内核之时间系统
- 洛谷1522牛的旅行
- javascript option 菜单图标_MacBook上神奇的Option键
- python常用的装饰器有哪些_python基本装饰器
- Unity Shaders and Effects Cookbook (3-4) 使用高光贴图
- call mysql_connect_Call to undefined function mysql_connect()
- jroo,已开源,一个java web快速开发工具
- python中unitest_基于Python的unitest框架介绍
- C语言易错知识点总结
- 图解MongoChef的安装步骤
- 火焰检测方法和数据集记录
- ArcCatalog导出数据库中shapefile
- 【解决】 io.lettuce.core.RedisCommandExecutionException: ERR wrong number of arguments for 'set' command
- 腾讯云与本地主机socket通信网络问题
- SEO入门:网站站内优化流程
- Origin画图标签常见语法
- 微信小程序退出按钮退出方式
- js实现金额的大写转小写
- Java创建二维三维数组的几种方式
- 【C语言循环结构题目】在屏幕上打印n行*号倒三角形(此处n为6)
热门文章
- 系统学习NLP(二十七)--EMLo
- 电脑太慢了最简单的办法怎么弄_修电脑不求人—最实用办公室电脑故障及解决办法,办公室人都说好...
- java认证考试题库看不懂_一道JAVA认证考试试题,有点想不通,各位看看...
- PAT (Basic Level) Practice1029 旧键盘
- ubnutu更换合适源(阿里源)
- PTA-基础编程题目集-7-2 然后是几点
- git 基础用法梳理
- 图论--最小生成树总结(PrimKruskal)
- iOS·Charts·集成步骤
- 批量 // 注释替换为 /*的注释