QGraphicsView 如何让图形大小适配窗口

2024-01-21 11:04

本文主要是介绍QGraphicsView 如何让图形大小适配窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. setSceneRect 做什么用?

setSceneRect是一个Qt中的函数,用于设置QGraphicsView中的场景矩形(QRectF)。

QGraphicsView是一个用于显示和编辑图形场景的控件,而setSceneRect函数用于设置场景矩形,即指定场景的可视区域的大小和位置。具体来说,它的作用有以下几个方面:

  • 定义场景的大小:通过设置场景矩形,可以确定场景的大小范围,限制可视区域的大小。只有在场景矩形内的图形项才会在QGraphicsView中显示。
  • 控制缩放和滚动:设置场景矩形后,可以使用QGraphicsView的缩放和滚动功能来在场景中导航。缩放操作将调整可视区域的大小,而滚动操作将改变可视区域的位置。
  • 处理场景坐标:场景矩形定义了场景坐标系统的范围,可以通过坐标转换函数(如mapToScene和mapFromScene)将场景坐标转换为视图坐标或反之。

通过调用setSceneRect函数,您可以根据需要设置场景的大小和位置,以控制QGraphicsView中的显示和交互行为。

2. setSceneRect 后,如何让graphicsView显示SceneRect 范围的全部图像?

设置了setSceneRect后,可以使用以下方法让graphicsView显示sceneRect范围的全部图像:

  • 使用fitInView函数:可以调用fitInView函数将sceneRect自适应地缩放到graphicsView的视图中。示例代码如下:
ui->graphicsView->fitInView(ui->graphicsView->sceneRect(), Qt::KeepAspectRatio);
  • 手动设置缩放级别:根据sceneRect的大小和graphicsView的大小,手动计算缩放比例,并使用scale函数进行缩放。示例代码如下:
QRectF sceneRect = ui->graphicsView->sceneRect();
QRectF viewRect = ui->graphicsView->viewport()->rect();
float scaleX = viewRect.width() / sceneRect.width();
float scaleY = viewRect.height() / sceneRect.height();
float scale = qMin(scaleX, scaleY);
ui->graphicsView->scale(scale, scale);
  • 设置graphicsView的alignment属性:将graphicsView的alignment属性设置为Qt::AlignCenter,可以确保sceneRect居中显示在graphicsView中。示例代码如下:
ui->graphicsView->setAlignment(Qt::AlignCenter);

这些方法可以根据需要选择使用,以确保sceneRect范围的全部图像在graphicsView中完整显示。

3. fitInView如何只缩放图形的尺寸,不改变线宽呢?

要在使用fitInView函数时只缩放图形的尺寸而不改变线宽,可以通过以下步骤实现:

  • 在调用fitInView函数之前,获取当前的缩放因子。
  • 调用fitInView函数进行自适应缩放。
  • 在缩放后,将线宽恢复到原始值的倒数。

以下是示例代码:

// 获取当前的缩放因子
float currentScaleFactor = ui->graphicsView->transform().m11();// 调用fitInView进行自适应缩放
ui->graphicsView->fitInView(ui->graphicsView->sceneRect(), Qt::KeepAspectRatio);// 计算需要还原的线宽比例
float lineWidthScaleFactor = 1.0 / ui->graphicsView->transform().m11();// 还原线宽
QGraphicsScene* scene = ui->graphicsView->scene();
foreach (QGraphicsItem* item, scene->items()) {item->setPen(QPen(item->pen().width() * lineWidthScaleFactor));
}

通过将线宽乘以缩放因子的倒数,可以保持线宽与图形尺寸的比例不变,实现只缩放图形的尺寸而不改变线宽。

这篇关于QGraphicsView 如何让图形大小适配窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629313

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

PDFQFZ高效定制:印章位置、大小随心所欲

前言 在科技编织的快节奏时代,我们不仅追求速度,更追求质量,让每一分努力都转化为生活的甜蜜果实——正是在这样的背景下,一款名为PDFQFZ-PDF的实用软件应运而生,它以其独特的功能和高效的处理能力,在PDF文档处理领域脱颖而出。 它的开发,源自于对现代办公效率提升的迫切需求。在数字化办公日益普及的今天,PDF作为一种跨平台、不易被篡改的文档格式,被广泛应用于合同签署、报告提交、证书打印等各个

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

Linux下获取硬盘空间的大小

1. df 命令查看所有硬盘设备的信息 2. 查看指定路径的磁盘空间大小 代码获取空间大小案例:

Windows11电脑上自带的画图软件修改照片大小(不裁剪尺寸的情况下)

针对一张图片,有时候上传的图片有大小限制,那么在这种情况下如何修改其大小呢,在不裁剪尺寸的情况下 步骤如下: 1.选定一张图片,右击->打开方式->画图,如下: 第二步:打开图片后,我们可以看到图片的大小为82.1kb,点击上面工具栏的“重设大小和倾斜”进行调整,如下: 第三步:修改水平和垂直的数字,此处我修改为分别都修改为50,然后保存,可以看到大小变成63.5kb,如下:

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

主窗口的设计与开发(二)

主窗口的设计与开发(二) 前言         在上一集当中,我们完成了主窗口的初始化,主窗口包括了左中右三个区域。我们还完成了对左窗口的初始化,左窗口包括了用户头像、会话标签页按钮、好友标签页按钮以及好友申请标签页按钮。对于切换每个标签页,我们还做了初始化信号槽的内容。最后我们将整个MainWidget类设置为单例模式。         那么这一集我们将继续完成主窗口的设计与开发,这一集我