QGraphicsview相关学习

news2024/9/23 7:28:26

文章学习自:

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.coloradmin.cn/o/2090709.html

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

相关文章

房产报备小程序房产报备系统源码搭建方案

房产客户报备小程序开发&#xff0c;php开发语言&#xff0c;前端是uniapp。 房产报备小程序三个端&#xff1a;报备端&#xff08;经纪人报备客户&#xff09;&#xff0c;确客端&#xff08;员工确认报备的客户&#xff09;&#xff0c;管理后台 一 报备端 经纪人报备客户…

生物制药中的AI困境:创新突破还是过度炒作?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Your Diffusion Model is Secretly a Zero-Shot Classifier论文阅读笔记

Your Diffusion Model is Secretly a Zero-Shot Classifier论文阅读笔记 这篇文章我感觉在智源大会上听到无数个大佬讨论&#xff0c;包括OpenAI Sora团队负责人&#xff0c;谢赛宁&#xff0c;好像还有杨植麟。虽然这个文章好像似乎被引量不是特别高&#xff0c;但是和AI甚至…

使用 streamlink 把 m3u8 转为 mp4

问题描述&#xff0c; 背景&#xff0c; 来源&#xff1a; 下载 m3u8 ts —> 转为mp4, 按照以往的做法&#xff0c; 就是使用 python requests 一步一步地下载 m3u8, ts&#xff0c; 然后转换。 但是个人写的东西&#xff0c;毕竟问题比较多。 而且&#xff0c; 但是&…

坑——Redis集群key事件通知

redis集群的key事件通知不像普通的订阅发布消息&#xff0c;普通的订阅发布&#xff0c;在任何一个节点订阅通道&#xff0c;都可以收到消息&#xff0c;但是集群的key事件通知只在key所在的主从节点发出通知&#xff0c;只能通过订阅这个key所在的主从节点收到消息&#xff1b…

Leetcode3240. 最少翻转次数使二进制矩阵回文 II

Every day a Leetcode 题目来源&#xff1a;3240. 最少翻转次数使二进制矩阵回文 II 解法1&#xff1a;分类讨论 特殊情况&#xff1a; 讨论正中间一排&#xff08;如果 m 是奇数&#xff09;和正中间一列&#xff08;如果 n 是奇数&#xff09;中的格子要如何翻转。 综上所…

Qt Creator 配置pcl1.14.1

1.安装pcl1.14.1 地址&#xff1a;Releases PointCloudLibrary/pcl (github.com) 下载前两个 下载完成后双击exe文件&#xff0c;修改一下安装路径&#xff0c;然后一路下一步。 OpenNI2 默认安装到C:\Program Files 下了&#xff0c;想修改OpenNI2 的安装路径&#xff0c;可…

Unity 动态光照贴图,加载后显示变暗或者变白问题 ReflectionProbe的使用

动态加载光照贴图代码&#xff0c;可参考这个帖子 Unity 预制动态绑定光照贴图遇到变白问题_unity urp 动态加载光照信息 变黑-CSDN博客 这次遇到的问题是&#xff0c;在编辑器下光照贴图能正常显示&#xff0c;打出apk后光照贴图加载后变黑的问题 以下4张图代表4种状态&…

网页正文提取算法:行块分布算法 Readability

前提 爬取百度、搜狗、必应等搜索引擎时&#xff0c;详情页的正文因来源多样而无法简单通过通用的规则来匹配&#xff0c;这就需要相关的提取算法。 本文在此介绍两种网页正文提取算法&#xff1a;行块分布算法 & Readability。 行块分布算法 算法流程 算法依据 HTML 每…

Feign的原理及概念

1.什么是Feign Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c;Feign可帮助我们更加便捷、优雅地调用HTTP API。Feign可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验&#xff0c;开发者完全感知不到这是远程方法&#xff0c;更感知不到这是个HTTP请求…

迁移学习之领域偏移(domain shift)

实际应用中很多任务的数据的标注成本很高&#xff0c;无法获得充足的训练数据&#xff0c;这种情况可以 使用迁移学习&#xff08;transfer learning&#xff09;。假设 A、B 是两个相关的任务&#xff0c;A 任务有很多训练数 据&#xff0c;就可以把从A任务中学习到的某些可以…

监控域名到期发送钉钉消息通知

目的 想象一下&#xff0c;域名到期都不知道&#xff0c;忘了续费&#xff0c;就像忘了交房租&#xff0c;房东&#xff08;互联网&#xff09;会毫不留情地把你扫地出门&#xff01;所以&#xff0c;及时续费&#xff0c;让顾客轻松找到你&#xff0c;生意红红火火&#xff0…

掌握测试的艺术:深入探索Python的pytest库

文章目录 **掌握测试的艺术&#xff1a;深入探索Python的pytest库**背景&#xff1a;为什么选择pytest&#xff1f;pytest是什么&#xff1f;如何安装pytest&#xff1f;5个简单的库函数使用方法1. pytest.main()2. pytest.skip()3. pytest.mark.parametrize()4. pytest.raises…

从跟跑到领跑:AIGC时代国产游戏的崛起与展望

文章目录 一、技术深度挖掘1.图形渲染与视觉盛宴2.物理引擎的精细化与真实性3.AI技术的深度融入与创新 二、行业影响深度剖析1.产业链的全面升级2.IT人才需求的多元化与高端化3.文化输出与国际影响力的增强 三、未来趋势与跨界合作1.技术创新引领未来2.跨界合作拓展市场 四、代…

VLM(视觉语言模型)综述

概述 大型语言模型的出现标志着人工智能领域转型的开始&#xff0c;它们在文本信息处理上的能力极大地推动了这一进程。尽管LLMs在文本处理上表现出色&#xff0c;但它们主要限于处理单一模态的数据&#xff0c;即文本。这限制了它们在理解和生成涉及图像和视频等多模态数据方…

最新华为OD机试-E卷-流浪地球(100分)-五语言题解(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

XSS LABS - Level 20 过关思路

关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客 0x01:环境配置 提示:Flash 逆向工具 JPEXS 配置请看 Level 19 的过关流程,这里就不重新教怎么安装配置了。 要想完成本关,需要下载 Flash,不然就会出现下面的情况: 我个人建议,是直接下载一个 Flash…

HUD杂散光环境模拟测试设备

概述 HUD&#xff08;Head-Up Display&#xff09;杂散光环境模拟测试设备是用于模拟飞行器在实际运行过程中可能遇到的多种光照环境的系统。它主要用于测试和验证HUD显示系统的性能&#xff0c;确保其能在各种光线条件下清晰、准确地显示信息&#xff0c;从而保障飞行员在复杂…

学习C语言(19)

整理今天的学习内容 1.memmove使用和模拟实现 void* memmove (void* destination&#xff0c;const void* source&#xff0c;size_t num&#xff09;&#xff1b; 和momcpy的差别是memmove函数处理的源内存块和目标内存块是可以重叠的 memmove的模拟实现&#xff1a; 2.mem…

程序批量卸载工具 | BCUninstaller v5.8.1 绿色版

大家好&#xff0c;今天电脑天空给大家推荐一款强大的Windows软件卸载工具——Bulk Crap Uninstaller&#xff08;BCUninstaller&#xff09;。如果你经常需要安装和卸载软件&#xff0c;那么这款工具绝对值得你一试。以下是我在使用BCUninstaller的一些心得分享&#xff0c;希…