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

相关文章

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

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... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间