QGraphicsview相关学习

文章学习自:

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

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

(1)

自定义类MyGraphicsView继承自QGraphicsView

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

[virtual protected] void QGraphicsView::wheelEvent(QWheelEvent *event)

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(); 

    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.mzph.cn/news/878568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《python语言程序设计》第8章第11题将反向字符串 编写一个函数反向一个字符串,reverse(s)

def reverse(text_arrange):len_text len(text_arrange)dec_text ""for i in range(1, len_text 1):# print(i)dec_text text_arrange[-i]print(f"反向输出{dec_text}")reverse("12345678") reverse("abcdefg")

每日刷题(图论)

P1119 灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 看数据范围知道需要用到Floyd算法&#xff0c;但是道路是不能直接用的&#xff0c;需要等到连接道路的两个村庄重建好才可以使用&#xff0c;所以这需要按照时间依次加入中转点&#xff0c…

微信小程序接入客服功能

前言 用户可使用小程序客服消息功能&#xff0c;与小程序的客服人员进行沟通。客服功能主要用于在小程序内 用户与客服直接沟通用&#xff0c;本篇介绍客服功能的基础开发以及进阶功能的使用&#xff0c;另外介绍多种客服的对接方式。 更多介绍请查看客服消息使用指南 客服视…

城市智慧公厕建设,提高市民使用体验,提升城市形象

随着智慧城市的建设步伐不断加快&#xff0c;智慧公厕作为城市公共服务设施的重要组成部分&#xff0c;正逐渐成为提升市民生活质量和城市形象的关键环节。智慧公厕不仅通过一系列先进的软硬件技术改善了市民的如厕体验&#xff0c;还提升了城市的管理水平和文明程度。本文将详…

利用深度学习实现验证码识别-3-ResNet18

在当今数字化时代&#xff0c;验证码作为一种重要的安全验证手段&#xff0c;广泛应用于各种网络场景。然而&#xff0c;传统的验证码识别方法往往效率低下&#xff0c;准确率不高。今天&#xff0c;我们将介绍一种基于 ResNet18 的验证码识别方法&#xff0c;它能够高效、准确…

Canvas绘制线条时断断续续的

解决线条断断续续的关键代码如下&#xff1a; 我们可以使用quadraticCurveTo来实现贝塞尔曲线使其变成光滑的曲线 注意&#xff1a; ctx.value.lineCap "round"; ctx.value.lineJoin "round"; 这两个属性是必须设置的 lastX&#xff0c;…

域名是什么

在这个数字世界中&#xff0c;域名无疑是连接用户与网站的关键纽带。域名&#xff0c;是由一串字符组成的地址&#xff0c;用于在互联网上唯一标识和定位一个特定的资源。本文将深入探讨域名的概念、作用以及对互联网发展的重要性。 一、域名的定义与结构 域名可以看作是互联网…

MySQL第10讲--约束的介绍

文章目录 前言约束约束的演示 外键约束删除外键外键删除/更新行为 前言 在第9讲MySQL第9讲–函数的介绍中我们主要介绍了几种mysql的内置函数&#xff1a;字符串函数、数值函数、流程函数、日期函数&#xff0c;并对这些函数中常用的几种函数做了总结&#xff0c;如下图所示&am…

大跨度工业仓储气膜:零排放与消防安全的理想选择—轻空间

在现代工业仓储领域&#xff0c;气膜结构建筑因其独特的优势逐渐受到企业的青睐。它不仅能够提供大跨度的无柱空间&#xff0c;还具备零排放、环保、快速建造、灵活应用等诸多优点&#xff0c;同时满足严格的消防安全要求&#xff0c;是实现高效仓储管理和可持续发展的理想选择…

密钥分发与公钥认证:保障网络通信的安全

在网络通信中&#xff0c;密钥的安全分发和公钥的有效认证是确保系统安全的关键。本文将为基础小白介绍密钥分发与公钥认证的基本概念和实际应用&#xff0c;帮助大家更好地理解这些技术如何保障我们的网络通信安全。 1. 密钥分发与公钥认证的背景 由于密码算法是公开的&…

每天分享一个FPGA开源代码(2)- spi 读写Flash

Flash的用途主要是用于存储主控制器的程序&#xff0c;SPI -Flash芯片就是支持SPI通讯协议的flash芯片。 在FPGA开发中&#xff0c;一般有这两种方式下载程序到板子上&#xff1a; &#xff08;1&#xff09;通过 JTAG下载程序到FPGA中直接运行&#xff0c;下载速度快&#xff…

从误删到重生:2024年数据恢复软件市场新趋势与精选工具

现在科技发展越来越先进&#xff0c;大部分的办公内容也都是通过电脑来进行操作的。但是总免不了偶尔会遇到电脑蓝屏或者其他原因导致数据丢失的情况。那辛辛苦苦做好的材料不见了一定很恼火。这次我分享几个电脑数据恢复工具来解决这个问题。 1.福晰数据恢复 连接直达&#…

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …

操作系统面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 线程切换要保存哪些上下文&#xff1f; 当发生线程切换时&#xf…

【论文阅读】Stealing Image-to-Image Translation Models With a Single Query(2024)

摘要 Training deep neural networks(训练深度神经网络) requires(需要) significant computational resources(大量计算资源) and large datasets(大型数据集) that are often confidential(机密的) or expensive(昂贵的) to collect. As a result(因此), owne…

sed awk 第二版学习(二)—— 正则表达式语法

目录 一、表达式 二、成行的字符 1. 反斜杠 2. 通配符 3. 编写正则表达式 4. 字符类 &#xff08;1&#xff09;字符的范围 &#xff08;2&#xff09;排除字符类 &#xff08;3&#xff09;POSIX 字符类补充 5. 重复出现的字符 6. 匹配单词 7. gres 替换脚本 8. …

2024-09-02 Ubuntu固定USB串口名(包括1拖N的USB串口)

在运行Ubuntu系统的开发板上,如果使用可插拔的USB串口,有时候程序正在运行时,如果突然连接传感器的USB串口设备被插拔了一下,这时,会发现系统中的USB串口名发生了改变。例如,插拔之前是/dev/ttyUSB0,插拔之后变成了/dev/ttyUSB3。发生这种情况的时候,有时候会导致程序无…

关于VUE3开发频繁引入ref,reactive,computed等基础函数。

利用unplugin-auto-import插件可以避免频繁引入ref&#xff0c;reactive&#xff0c;computed等基础函数。 1.安装unplugin-auto-import依赖 npm i -D unplugin-auto-import 2.在vite.config.ts中注入依赖 效果

关于主流电商平台|淘宝|拼多多|抖音|1688官方平台接口的接入和返回

taobao.trades.sold.get( 查询卖家已卖出的交 搜索当前会话用户作为卖家已卖出的交易数据&#xff08;只能获取到三个月以内的交易信息&#xff09; 1. 返回的数据结果是以订单的创建时间倒序排列的。 2. 返回的数据结果只包含了订单的部分数据&#xff0c;可通过taobao.trade…

代码随想录Day 32|leetcode题目:501.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 动态规划理论基础一、理论基础1.1 什么是动态规划1.2 动态规划的解题步骤1.3 动态规划应该如何debug 二、题目题目一&#xff1a; 509. 斐波那契数解题思路&#xff1a;动态规划递归解法 题目二&a…