QGraphicsview相关学习

ops/2024/11/14 11:53:06/

文章学习自:

Qt_绘图框架_QGraphicsview实现缩放移动图片_Livy0123的博客-CSDN博客

这里进行一些自己的分析和理解。

(1)

自定义类MyGraphicsView继承自QGraphicsView

核心是重定义的滚轮事件。

void MyGraphicsView::wheelEvent(QWheelEvent *ev)
{if(Qt::CTRL == ev->modifiers())   //键盘CTRL键{if(ev->delta() > 0){qrTmp = 1.2;this->scale(qrTmp,qrTmp);}else{qrTmp = 1.0/1.2;this->scale(qrTmp,qrTmp);}m_qrScaledNum *= qrTmp;  //保存放大倍数}
}

实现功能是:通过转动滚轮,放大或缩小view,进而形成这样的视觉效果。

 

相关知识: 

ev->modifiers(); 

返回可能伴随wheel事件的键盘修饰符。

enum QWheelEvent::Modifiers

Constant

Value

Qt3DInput::QWheelEvent::NoModifier

Qt::NoModifier

Qt3DInput::QWheelEvent::ShiftModifier

Qt::ShiftModifier

Qt3DInput::QWheelEvent::ControlModifier

Qt::ControlModifier

Qt3DInput::QWheelEvent::AltModifier

Qt::AltModifier

Qt3DInput::QWheelEvent::MetaModifier

Qt::MetaModifier

Qt3DInput::QWheelEvent::KeypadModifier

Qt::KeypadModifier

    enum Modifier {META          = Qt::MetaModifier,SHIFT         = Qt::ShiftModifier,CTRL          = Qt::ControlModifier,ALT           = Qt::AltModifier,MODIFIER_MASK = KeyboardModifierMask,UNICODE_ACCEL = 0x00000000};

ev->delta(); 

  每当滚轮转动一下,默认是15度

  这时调用QWheelEvent()::delta()返回的值就是15*8=120。

ev->delta();
//滑动的距离
//向下滑动为负值
//向上滑动为正值

(2)

 

这个动图中,无法实现随着鼠标的移动,放大那个区域的图像。

而下面这个动图可以。

  

关键代码: 

    this->setMouseTracking(true);   //跟踪鼠标位置//这两句的作用://以鼠标中心点为锚点setTransformationAnchor(QGraphicsView::AnchorUnderMouse);setResizeAnchor(QGraphicsView::AnchorUnderMouse);

 (3)初始化MyGraphicsView对象和QGraphicsScene对象。

    //创建视图this->m_pView = new MyGraphicsView(this);m_pView->resize(VIEW_MAX_WIDTH,VIEW_MAX_HEIGHT);this->m_nViewWidth = m_pView->width();this->m_nViewHeight = m_pView->height();//创建场景this->m_pScene = new QGraphicsScene(this);//设置场景大小和左上角点坐标this->m_pScene->setSceneRect(0,0,VIEW_MAX_WIDTH,VIEW_MAX_HEIGHT);

(4)创建QGraphicsPixmapItem对象存储图片。

     //加载图片QString strFilePath = QFileDialog::getOpenFileName(this,tr("Load a Image!"),"C:/Users/zhengfei6/Desktop/testImage",tr("Images(*.png *.jpg *.bmp)"));if(NULL == strFilePath){cout << "FilePath is Null";return;}//加载图片QPixmap pix;pix.load(strFilePath);QGraphicsPixmapItem *pPixItem = new QGraphicsPixmapItem(pix);pPixItem->setFlag(QGraphicsItem::ItemIsMovable,true);//item可移动

(5)为了显示时直接适应视图,需要调整pPixItem的大小和位置。

     //获取缩放比例DisplayModeEnum displayMode = DisplayModeEnum::TOPLEFT;  //默认左上顶点显示this->m_qrDefaultShrinkedRatio = GetDefaultRatio(pix,displayMode);pPixItem->setScale(1/this->m_qrDefaultShrinkedRatio);//调整item大小,实际上,图像大小是没有变的。

程序作用:

返回值 :图像的伸缩比例。

displayMode:

三种显示模式:

宽度>高度

 高度>宽度

 pos=(0,0)

qreal MyWidget::GetDefaultRatio(const QPixmap &pix,DisplayModeEnum &displayMode)
{qreal dResRatio = 0;qreal qrWidthRatio = (qreal)pix.width()/(qreal)VIEW_MAX_WIDTH;qreal qrHeightRatio = (qreal)pix.height()/(qreal)VIEW_MAX_HEIGHT;cout << "qrWidthRatio = "<< qrWidthRatio;cout << "qrHeightRatio = "<< qrHeightRatio;qreal nMaxTmp = qMax(qrWidthRatio,qrHeightRatio);  //取宽宽比和高高比的大者//举例:pix(1080,600),view(1080,400)//1,1.5//为了成功放下这张图片,需要调整图片大小为(1080*2/3,600*2/3)//宽调整为一致,看高,如果pix更大,放弃//高调整为一致,看宽,如果pix更大,放弃//  cout << "nMaxTmp = "<< nMaxTmp;if(qrWidthRatio == nMaxTmp)//宽宽比>高高比{dResRatio = qrWidthRatio;displayMode = DisplayModeEnum::YVerticalMiddle;//Y垂直轴居中}else//宽高比<=高高比{dResRatio = qrHeightRatio;displayMode = DisplayModeEnum::XHorizontalMiddle;//X水平轴居中}//cout << "dResRatio = "<< dResRatio;return dResRatio;
}

http://www.ppmy.cn/ops/104139.html

相关文章

关于数字存储和byte[]数组的一些心得

前言 最近做项目&#xff0c;发现一些规律&#xff0c;比如数字的存储和字符串的存储&#xff0c;先说数字吧&#xff0c;最常见的整数&#xff0c;就涉及反码和补码&#xff0c;根据这些规则&#xff0c;甚至我们自己也能造一种数据存储结构&#xff0c;比如1个字节8bit&…

鸿蒙上架流程

鸿蒙应用发布上架相关流程&#xff1a; 发布所需要申请的证书和profile文件&#xff0c;然后在appGallery Connect提交上架申请&#xff0c;审批通过分发到各个渠道 流程&#xff1a; 在appGallery Connect选择项目&#xff0c;创建添加项目&#xff0c;填写对应信息&#xff0…

莫比乌斯反演总结

目录 前置知识1.1 线性筛 (欧拉筛)1.2 整除分块 (数论分块)引理 1引理 2引理 3实现例 1例 2例 3例 4 1.3 数学知识积性函数莫比乌斯函数狄利克雷(Dirichlet)卷积 莫比乌斯反演2.1 公式2.2 常用~(唯一)~结论2.3 例题例 1例 2例 3例 4例 5练习 1练习 2练习 3练习 4 懵逼乌斯反演总…

汽车免拆诊断案例 | 马自达CX-3无音频输出

故障现象&#xff1a; 使用触摸屏打开收音机时&#xff0c;单选按钮打开收音机&#xff0c;但无法访问菜单。使用中控台中的旋转控制旋钮时&#xff0c;也会遇到相同的情况。 没有音频输出到车上的任何扬声器&#xff0c;包括卫星导航、蓝牙或语音识别。音量调节也不起作用&a…

word宏代码选择所有公式 选择所有表格

选择视图-宏代码 输入宏名字【SelectAllEquations】&#xff0c;选择加号&#xff0c;添加宏代码 输入宏代码&#xff0c;并保存&#xff0c;然后关闭&#xff1a; Sub SelectAllEquations()Dim xMath As OMathDim I As IntegerWith ActiveDocument.DeleteAllEditableRanges w…

【提示学习论文】CoCoLe:Conceptual Codebook Learning for Vision-Language Models

Conceptual Codebook Learning for Vision-Language Models&#xff08;ECCV 2024&#xff09; CPL的改进暂无代码 CPL 详见CPL论文 CoCoLe a&#xff1a;手工概念缓存的建立过程b&#xff1a;制作提示的过程&#xff0c;将图像输入Ev&#xff0c;得到image features v 作…

一个比 Nginx 还简单的 Web 服务器

企业级的 Web 服务器非常多&#xff0c;Nginx、Tomcat、Apache、IIS、FastAPI、Flask 等。今天松哥再给大家介绍一个开源的 Web 服务器&#xff0c;这款服务器具备自动 HTTPS 功能和高度可配置性&#xff0c;它的名字是&#xff1a;Caddy。 Caddy 是一个 Go 编写的 Web 服务器&…

基于SSM+小程序的宿舍管理系统(宿舍1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 本宿舍管理系统小程序有管理员和学生两个角色。 1、管理员功能有个人中心&#xff0c;公告信息管理&#xff0c;班级管理&#xff0c;学生管理&#xff0c;宿舍信息管理&#xff0c;宿舍…