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

相关文章

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

【前端学习】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作为一种跨平台、不易被篡改的文档格式,被广泛应用于合同签署、报告提交、证书打印等各个