qt QPainter setViewport setWindow viewport window
使用qt版本5.15.2
引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况,以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染(分别对应下方demo1,demo2,demo3)。
setViewport用于指定在widget的哪块区域做为QPainter的渲染区;而setWindow用于为viewport指定的区域建立新的坐标系。新坐标系的物理单位长度与widget中坐标系的物理单位长度是不一样的,拥有了新坐标系就可以将viewport指定的区域虚拟成一个窗口(window)来用了。
setviewport(QRect(x,y,width,height))/setviewport(int x,int y,int width,int height); //指定在widget的具体位置和区域作为viewport(视口),作为painter的操作区域,这里的x,y为widget坐标系下的坐标
setWindow(QRect(x,y,width,height))/setWindow(int x,int y,int window_width,int window_height); //设置窗口坐标系,以及对viewport指定的操作区域大小进行重新划分(新的划分不以像素为单位了,而是一个虚拟的长度单位)。类似于长度换算中将10cm重新划分为n份,那么n份的单位长度就不是cm了。这里的x,y是新坐标系下的坐标。
window中坐标系横轴的单位长度为像素单位(widget坐标系的长度单位)为viewport.width/window.width;window中坐标系的纵轴单位长度单位长度换算为像素单位(widget坐标系的宽度单位)为viewport.height/window.height
坐标换算
假设虚拟window坐标系的起始点位(w.x0,w.y0),window的size为(w.w,w.h);viewport指定区域的起始点坐标为(v.x0,v.y0),指定区域的size为(v.w,v.h);
那么window中的一个点p(w.x,w.y),(线性)映射到widget坐标系下相对于 viewport的起始点的 坐标为
(v.x,v.y),(线性)映射到widget下的坐标为(x,y),那么
v.x=(w.x+w.x0)*v.w/w.w
v.y=(w.y+w.y0)*v.h/w.h
x = v.x0+v.x = v.x0+(w.x+w.x0)*v.w/w.w
y = v.y0+v.y = v.y0+(w.y+w.y0)*v.h/w.h
QPainter如果没有setViewport,那么viewport的rect()为QRect(0,0,widget.width,widget.height),当widget改变大小时(resize),viewport的rect()也会跟着对应变化为QRect(0,0,widget.width,widget.height)。
QPainter如果没有setWindow,那么window的rect()与上面一样。
这样就保证了改变widget的size的时候,viewport和window的rect()保持一样并且跟着窗口大小变化!!这样QPainter内容的伸缩因子(v.w/w.w,v.h/w.h)是不变的。导致的结果就是QPainter绘制的内容不会随着widget窗口伸缩。
当QPainter setViewport(rectValue)后,viewport的rect就定死了,不管widget如何改变,viewport的rect()都为rectValue。
setWindow对window的rect影响同上。
setViewport(rectValue1),表示在widget上划定了一块具体的区域。不管widget是否改变大小,是否移动,viewport就是占据着widget的这块区域,类似下面的viewport指定QRect(0,0,200,200)。
用 ffmpeg(最新版本) 制作gif
ffmpeg -f gdigrab -i desktop -t 20 -r 10 -vf “crop=640:480:500:300,setpts=PTS-STARTPTS" E:/video/test.mp4 -y //录制桌面,-t录制20秒,-r帧率为10,-vf指定视频滤镜crop(裁剪,参数为width:height:x:y), -y 覆盖式写入文件,按ctrl+c强制结束录制
ffplay -vf "drawtext=text='%{pts\:hms}':x=10:y=10:fontsize=40:fontcolor=red" -i E:/video/1/test.mp4 //播放视频,并显示时间戳
ffmpeg -i E:/video/test.mp4 -ss 2 -t 8 -r 1 E:/video/1/out_%d.png -y //提取图片序列,-ss 视频开始时间,-t指定时长,-r从视频中一秒区一帧
ffmpeg -framerate 4 -i E:/video/1/out_%d.png E:/video/1/out.gif -y //将图片序列组成gif,帧率为4
ffplay -loop -1 -i E:/video/1/out.gif //循环播放gif进行查阅,按esc退出//更多ffmpeg操作命令了解参考https://blog.csdn.net/qiushangren/article/details/132777272
setViewport之后一般要做setWindow操作,否则window()所得到的QRect会随着widget窗口缩放而变化,这会导致QPainter画出来的内容变化诡异。
做了setWindow操作但是不做setViewport操作,意思是以整个widget为viewport,让viewport的rect()的值随着widget窗口的resize而变化,就能让QPainter画出来的内容随着widget窗口变化而伸缩。
QPainter中,除了setViewport() viewport()使用的坐标和单位长度是widget的坐标(与实际像素点完全匹配)和其坐标系的单位长度。其他所有的成员函数参数使用的坐标和单位长度都是QPainter中虚拟出来的window的坐标系下的坐标和单位长度。
//demo 1
//既不做setWindow操作,也不做setViewport操作,让QPainter画出来的内容不随着窗口resize而伸缩
void Widget::paintEvent(QPaintEvent *event) //假设widget的长宽为700x600
{QPainter painter(this);painter.drawRect(10,10,60,50); //在画布上画正四边形,起点为画布的(10,10),长宽为60,50.
}----------------------
//demo 2
//做setWindow操作,但是不做setViewport操作,让QPainter画出来的内容随着窗口resize而伸缩
void Widget::paintEvent(QPaintEvent *event) //假设widget的长宽为700x600
{QPainter painter(this);painter.setWindow(10,10,300,300); //建立新坐标系,将(10,10)作为painter画布yy1的起点,yy1的长宽都为300(这里的单位不是像素)painter.drawRect(10,10,60,50); //在画布上画正四边形,起点为画布的(10,10),长宽为60,50.(这里的单位不是像素,而是window建立的新坐标系的单位)
}//demo 3
//做setViewport操作,也做setWindow操作,让QPainter在widget上setViewport指定的区域内渲染/绘制。内容不会随着窗口resize而伸缩或移动
void Widget::paintEvent(QPaintEvent *event) //假设widget的长宽为700x600
{QPainter painter(this);painter.setViewport(100,100,300,300) //指定widgetQRect(100,100,300,300)区域作为viewportpainter.setWindow(10,10,500,500); //将viewport指定的区域重新做一次划分,并在viewport指定的区域上建立新坐标系(新坐标系单位不是像素了,而是虚拟出来的单位)。将widget的坐标(10,10)作为painter画布yy1的起点,yy1的长宽都为300painter.drawRect(10,10,60,50); //在画布上画正四边形,起点为画布的(10,10),长宽为60,50.(这里的单位不是像素,而是window建立的新坐标系的单位)
}
相关文章:
qt QPainter setViewport setWindow viewport window
使用qt版本5.15.2 引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况,以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染(分别对应下方demo1,demo2,demo3)。 setViewpo…...
网络安全面试题汇总(个人经验)
1.谈一下SQL主从备份原理? 答:主将数据变更写入自己的二进制log,从主动去主那里去拉二进制log并写入自己的二进制log,从而自己数据库依据二进制log内容做相应变更。主写从读 2.linux系统中的计划任务crontab配置文件中的五个星星分别代表什么ÿ…...
【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第13章ospf路由协议】理论和实操
文章目录 选择题(10道)理论题(5道)实操题(5道) 【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第12章ospf路由协议】理论和实操 选择题(10道) 在OSPF协议中,…...
FreeType 介绍及 C# 示例
FreeType 是一个开源的字体渲染引擎,用于将字体文件(如 TrueType、OpenType、Type 1 等)转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域,支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…...
金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成
目录 一、⾃动化测试理论 二、自动化脚本 1、添加断言 1️⃣注册、登录 2️⃣认证、充值、开户、投资 2、可重复执行:清除测试数据脚本按指定顺序执行 1️⃣如何可以做到可重复执⾏? 2️⃣清除测试数据:连接数据库setup线程组 ①明确…...
Linux网络知识——路由表
路由表 1 定义与作用 Linux路由表是一个内核数据结构,用于描述Linux主机与其他网络设备之间的路径,以及如何将数据包从源地址路由到目标地址。路由表的主要作用是指导数据包在网络中的传输路径,确保数据包能够准确、高效地到达目标地址。 …...
浅谈云计算14 | 云存储技术
云存储技术 一、云计算网络存储技术基础1.1 网络存储的基本概念1.2云存储系统结构模型1.1.1 存储层1.1.2 基础管理层1.1.3 应用接口层1.1.4 访问层 1.2 网络存储技术分类 二、云计算网络存储技术特点2.1 超大规模与高可扩展性2.1.1 存储规模优势2.1.2 动态扩展机制 2.2 高可用性…...
AI 编程工具—Cursor进阶使用 阅读开源项目
AI 编程工具—Cursor进阶使用 阅读开源项目 首先我们打开一个最近很火的项目browser-use ,直接从github 上克隆即可 索引整个代码库 这里我们使用@Codebase 这个选项会索引这个代码库,然后我们再选上这个项目的README.md 文件开始提问 @Codebase @README.md 这个项目是用…...
使用 WPF 和 C# 将纹理应用于三角形
此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …...
Elasticsearch搜索引擎(二)
RestClient 基础 前言一、RestAPI1. 初始化 *RestClient*2. 创建索引库3. 删除索引库4. 判断索引库是否存在 二、RestClient操作文档1.新增文档2.查询文档3. 删除文档4. 修改文档5. 批量导入文档 前言 ES官方提供了各种不同语言的客户端用来操作ES,这些客户端的本质…...
unity学习17:unity里的旋转学习,欧拉角,四元数等
目录 1 三维空间里的旋转与欧拉角,四元数 1.1 欧拉角比较符合直观 1.2 四元数 1.3 下面是欧拉角和四元数的一些参考文章 2 关于旋转的这些知识点 2.1 使用euler欧拉角旋转 2.2 使用quaternion四元数,w,x,y,z 2.3 使用quaternion四元数,类 Vector3.zero 这种…...
走出实验室的人形机器人,将复刻ChatGPT之路?
1月7日,在2025年CES电子展现场,黄仁勋不仅展示了他全新的皮衣和采用Blackwell架构的RTX 50系列显卡,更进一步展现了他对于机器人技术领域,特别是人形机器人和通用机器人技术的笃信。黄仁勋认为机器人即将迎来ChatGPT般的突破&…...
如何使用wireshark 解密TLS-SSL报文
目录 前言 原理 操作 前言 现在网站都是https 或者 很多站点都支持 http2。这些站点为了保证数据的安全都通过TLS/SSL 加密过,用wireshark 并不能很好的去解析报文,我们就需要用wireshark去解密这些报文。我主要讲解下mac 在 chrome 怎么配置的&…...
电脑有两张网卡,如何实现同时访问外网和内网?
要是想让一台电脑用两张网卡,既能访问外网又能访问内网,那可以通过设置网络路由还有网卡的 IP 地址来达成。 检查一下网卡的连接 得保证电脑的两张网卡分别连到外网和内网的网络设备上,像路由器或者交换机啥的。 给网卡配上不一样的 IP 地…...
定义:除了Vue内置指令以外的其他 v-开头的指令(需要程序员自行扩展定义)作用:自己定义的指令, 可以封装一些 dom 操作, 扩展
1.自定义指令(directives) 1.用法 定义:除了Vue内置指令以外的其他 v-开头的指令(需要程序员自行扩展定义)作用:自己定义的指令, 可以封装一些 dom 操作, 扩展额外功能 语法: ① 局部注册 ●inserted:被绑…...
SpringBoot错误码国际化
先看测试效果: 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//# code命名规则:模…...
LeetCode 3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间
【LetMeFly】3066.超过阈值的最少操作数 II:模拟 - 原地建堆O(1)空间 / 优先队列O(n)空间 力扣题目链接:https://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/ 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一次…...
深度学习中的模块复用原则(定义一次还是多次)
文章目录 1. 模块复用的核心原则(1)模块是否有**可学习参数**(2)模块是否有**内部状态**(3)模块的功能需求是否一致 2. 必须单独定义的模块(1)nn.Linear(全连接层&#x…...
Mac——Cpolar内网穿透实战
摘要 本文介绍了在Mac系统上实现内网穿透的方法,通过打开远程登录、局域网内测试SSH远程连接,以及利用cpolar工具实现公网SSH远程连接MacOS的步骤。包括安装配置homebrew、安装cpolar服务、获取SSH隧道公网地址及测试公网连接等关键环节。 1. MacOS打开…...
安全测评主要标准
大家读完觉得有帮助记得关注和点赞!!! 安全测评的主要标准包括多个国际和国内的标准,这些标准为信息系统和产品的安全评估提供了基础和指导。 一、安全测评的主要标准 1.1、国际标准 可信计算机系统评估准则(TC…...
别再只会用百度搜了!手把手教你用site语法精准锁定CSDN、知乎等网站的技术文章
技术搜索的艺术:用site语法打造高效信息获取系统 每次打开搜索引擎,输入技术关键词后,铺天盖地的结果中真正有用的内容却寥寥无几——这可能是大多数开发者都经历过的困扰。广告推广、低质量转载、过时教程混杂其中,而真正优质的C…...
stealth.js全解析:40+反检测补丁的配置与优化技巧
Stealth.js全解析:40反检测补丁的配置与优化技巧 在当今的Web自动化领域,反检测技术已成为开发者必须掌握的核心技能之一。无论是数据采集、自动化测试还是其他需要模拟真实用户行为的场景,如何让脚本"隐形"都是决定成败的关键因素…...
告别混乱文件管理:用NERDTree打造VIM项目导航系统
告别混乱文件管理:用NERDTree打造VIM项目导航系统 每次打开一个包含数百个文件的复杂项目时,你是否会感到一阵眩晕?当你在多个目录间反复切换查找某个配置文件时,是否觉得时间在指尖悄然流逝?对于资深VIM用户而言&…...
云原生图书馆管理系统架构设计:基于SaaS的一站式解决方案与实战案例分析
某中学图书馆数字化改造实战:传统Excel管理迁移至云端系统,借还效率提升300%,系统响应时间降低至200ms以内一、背景:传统图书馆管理的痛点分析1.1 技术债务积累在数字化转型的过程中,许多中小型学校图书馆依然停留在传…...
为什么92%的Java团队TCC失败?阿里P8级专家复盘6大反模式与可立即上线的加固模板
第一章:为什么92%的Java团队TCC失败?阿里P8级专家复盘6大反模式与可立即上线的加固模板TCC(Try-Confirm-Cancel)作为分布式事务的经典模式,在高并发、多服务协同场景中本应提供强一致性保障,但阿里内部审计…...
全能型 AI论文工具排行榜(2026 最新实测)
基于功能全面性、学术适配性、用户反馈质量以及操作便捷性,本文对当前主流AI论文写作工具进行了系统测评,按综合使用价值从高到低进行排序,并详细解析各工具的核心优势与适用领域。🏆 第一梯队:全流程学术解决方案&…...
突破百度网盘限速难题:非会员高速下载的技术实现与实战指南
突破百度网盘限速难题:非会员高速下载的技术实现与实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 当你急需下载一份600MB的项目资料,却发现百…...
Z-Image-Turbo-rinaiqiao-huiyewunv快速上手:Streamlit交互界面操作详解
Z-Image-Turbo-rinaiqiao-huiyewunv快速上手:Streamlit交互界面操作详解 1. 工具简介 Z-Image Turbo (辉夜大小姐-日奈娇)是一款基于Tongyi-MAI Z-Image底座模型开发的专属二次元人物绘图工具。它通过注入辉夜大小姐(日奈娇)微调权重,提供了高度优化的…...
嵌入式系统中SipHash轻量级哈希实现与优化
1. SipHash 嵌入式底层实现技术解析SipHash 是一种基于加法-循环-异或(Add-Rotate-Xor, ARX)结构的伪随机函数族,专为短输入消息设计,在嵌入式系统中广泛用于哈希表键值保护、拒绝服务(DoS)防护、安全计数器…...
Ruoyi-Vue3实战:10分钟搞定学生管理系统CRUD(附完整SQL)
Ruoyi-Vue3学生管理系统实战:从零到部署的完整指南 在当今快速迭代的开发环境中,选择高效的技术栈至关重要。Ruoyi-Vue3作为基于Spring Boot和Vue3的企业级开发框架,以其模块化设计和丰富的功能组件,成为快速构建管理系统的首选方…...
