You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt中QGraphicsView重复加载图片因窗口缩放出现尺寸异常的修复咨询

Qt重新加载图片时尺寸异常的修复方案

问题原因

你当前的代码在加载图片时,提前将图片缩放到了graphicsView的当前尺寸,之后resizeEvent里的fitInView又会基于这个已经缩放的图片再次做适配。第二次加载图片时,窗口尺寸如果已经变化,图片会基于上次缩放后的尺寸再次调整,导致重复缩放,最终出现图片大小异常的问题。

修复步骤及代码修改

核心思路是保留图片原始尺寸作为场景基准,仅通过fitInView来适配视图尺寸,避免提前缩放带来的叠加偏差:

  1. 加载图片时,直接使用原始尺寸创建QGraphicsPixmapItem,不要提前调用scaled
  2. 每次加载完成后,主动调用fitInView让图片适配当前视图
  3. 优化场景和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:52:46