ZBLOG

void WhiteBoard::setBackgroundImage(const QPixmap &pixmap) { // m_backgroundImage = pixmap.scaled(size(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation ); // m_hasBackground = true; qreal ratio = devicePixelRatio(); ...

在您的 setBackgroundImage 函数中,背景图片模糊可能有以下几个原因:

1. 高DPI缩放问题

您已经处理了 devicePixelRatio(),这是正确的方向,但可能还需要检查:

qreal ratio = devicePixelRatio();
m_backgroundImage = pixmap.scaled(
    size() * ratio,  // 这里乘以ratio是正确的
    Qt::KeepAspectRatio,
    Qt::SmoothTransformation
);
m_backgroundImage.setDevicePixelRatio(ratio);  // 这行也是必要的

2. 尺寸计算问题

  • size() 返回的是逻辑像素大小
  • pixmap.scaled() 需要物理像素大小(所以乘以ratio是对的)
  • 但最终显示时,Qt会自动根据devicePixelRatio调整

3. 可能的改进方案

void WhiteBoard::setBackgroundImage(const QPixmap &pixmap)
{
    if (pixmap.isNull()) return;
    
    qreal ratio = devicePixelRatio();
    QSize targetSize = size() * ratio;
    
    // 保持原图比例,但不超出画板范围
    m_backgroundImage = pixmap.scaled(
        targetSize,
        Qt::KeepAspectRatio,   // 保持宽高比
        Qt::SmoothTransformation
    );
    
    m_backgroundImage.setDevicePixelRatio(ratio);
    m_hasBackground = true;
    
    update();
}

4. 其他可能原因

  1. 原始图片分辨率不足 - 如果原始图片本身分辨率很低,放大后必然模糊
  2. 多次缩放累积 - 确保不要对同一图片多次调用scaled()
  3. 绘制时的插值方式 - 您已经使用Qt::SmoothTransformation这是最好的选择

5. 验证步骤

  1. 打印调试信息:
qDebug() << "Original pixmap size:" << pixmap.size();
qDebug() << "Target size:" << size();
qDebug() << "Device pixel ratio:" << ratio;
qDebug() << "Scaled size:" << m_backgroundImage.size();
  1. 尝试临时使用原图不缩放:
m_backgroundImage = pixmap; // 测试用原始尺寸

如果这样仍然模糊,说明问题不在缩放环节。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23993

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?