Qt中QGraphicsView重复加载图片因窗口缩放出现尺寸异常的修复咨询
Qt重新加载图片时尺寸异常的修复方案
问题原因
你当前的代码在加载图片时,提前将图片缩放到了graphicsView的当前尺寸,之后resizeEvent里的fitInView又会基于这个已经缩放的图片再次做适配。第二次加载图片时,窗口尺寸如果已经变化,图片会基于上次缩放后的尺寸再次调整,导致重复缩放,最终出现图片大小异常的问题。
修复步骤及代码修改
核心思路是保留图片原始尺寸作为场景基准,仅通过fitInView来适配视图尺寸,避免提前缩放带来的叠加偏差:
- 加载图片时,直接使用原始尺寸创建
QGraphicsPixmapItem,不要提前调用scaled - 每次加载完成后,主动调用
fitInView让图片适配当前视图 - 优化场景和item的管理,避免野指针和内存泄漏
修改后的完整代码:
void MainWindow::on_pushButton_clicked() //displaying an image by clicking the button { // 获取当前场景,不存在则创建 QGraphicsScene* scene = ui->graphicsView->scene(); if (scene != nullptr) { scene->clear(); // 清空场景,自动销毁之前的item } else { scene = new QGraphicsScene(this); ui->graphicsView->setScene(scene); } // 加载原始尺寸图片 pm.load("E:/QtProjects/resize/1.png"); QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pm); scene->addItem(item); // 让图片适配当前graphicsView尺寸 ui->graphicsView->fitInView(item, Qt::KeepAspectRatio); } void MainWindow::resizeEvent(QResizeEvent *event) //resize the image if the window was resized { QGraphicsScene* scene = ui->graphicsView->scene(); if (scene != nullptr && !scene->items().isEmpty()) { // 适配场景中的所有内容(这里仅单张图片) ui->graphicsView->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); } // 调用父类的resizeEvent保证窗口正常处理 QMainWindow::resizeEvent(event); }
关键说明
- 去掉
pm.scaled(...):避免提前将图片缩放到当前视图尺寸,保留原始像素信息作为场景的基准尺寸 - 加载后立即调用
fitInView:确保图片初始显示就适配当前窗口,和resize时的逻辑保持一致 - 优化场景管理:避免重复设置场景,同时通过
scene->clear()自动销毁旧item,防止内存泄漏 - 保留
resizeEvent逻辑:窗口缩放时,基于原始图片的场景尺寸进行适配,不会出现重复缩放的问题
内容的提问来源于stack exchange,提问作者Ogurchik
相关产品推荐
相关产品推荐

