Qt绘图应用窗口Resize时图像丢失,image.scaled无效求解决方案
解决Qt绘图窗口Resize时画布图像丢失的问题
我来帮你搞定这个Qt绘图窗口调整尺寸时丢图的问题!首先得点出你当前代码的核心问题:你现在在Resize事件里直接创建了一个全新的空白QImage并赋值给Image,这相当于直接把之前画的所有内容都替换成了空白画布,图像自然会丢失。至于image.scaled()没起作用,大概率是你没把缩放后的旧图像内容真正迁移到新画布上。
正确的处理逻辑应该是基于旧图像的内容,创建适配新窗口尺寸的新画布,再把旧内容完整绘制到新画布上,具体步骤和修改后的代码如下:
修改后的Resize Event处理代码
qDebug() << "Resized."; QSize newSize = event->size(); // 创建和新窗口尺寸一致的新画布,先填充白色背景 QImage newImage(newSize, QImage::Format_RGB32); newImage.fill(Qt::white); // 如果原来的画布已有内容,就把旧内容绘制到新画布上 if (!Image.isNull()) { QPainter painter(&newImage); // 这里提供两种绘制方式,按需选择: // 方式1:按新画布尺寸缩放旧图像,铺满整个窗口 painter.drawImage(newImage.rect(), Image, Image.rect()); // 方式2:保持旧图像的原始尺寸,绘制在新画布左上角(不缩放) // painter.drawImage(QPoint(0, 0), Image); } // 更新全局画布为新的带内容画布 Image = newImage; CurrentSize = newSize; IsDrawing = false; this->update();
关键逻辑解释
- 先创建新的空白画布并填充背景,再通过
QPainter把旧画布的内容迁移过去,彻底避免了直接覆盖旧内容的问题 - 加了
!Image.isNull()的判断,能避免程序第一次启动时Image未初始化导致的异常 - 两种绘制方式可以灵活切换:如果希望绘图内容跟着窗口缩放就用方式1,如果想保留原图大小就用方式2
这样修改后,你调整窗口尺寸时,之前绘制的内容就不会丢失了~
内容的提问来源于stack exchange,提问作者cannelle28
相关产品推荐
相关产品推荐

