ZBLOG

void WhiteBoard::setBackgroundImage(const QPixmap &pixmap) { if (pixmap.isNull()) return; // 获取实际需要的物理像素尺寸(考虑HiDPI) qreal ratio = devicePixelRatio(); m_backgroundImage = pixmap.scaled( size() * ratio, Q...

图片模糊的问题通常是由于缩放处理不当或HiDPI支持不完整导致的。以下是改进方案:

优化后的代码(解决模糊问题)

void WhiteBoard::setBackgroundImage(const QPixmap &pixmap)
{
    if (pixmap.isNull()) return;

    // 1. 获取设备像素比(HiDPI支持)
    qreal ratio = devicePixelRatioF(); // 使用devicePixelRatioF()获取更精确的比值
    
    // 2. 计算目标尺寸(逻辑像素 × 像素比)
    QSize targetSize = size() * ratio;
    
    // 3. 高质量缩放
    m_backgroundImage = pixmap.scaled(
        targetSize,
        Qt::KeepAspectRatioByExpanding,
        Qt::SmoothTransformation
    );
    
    // 4. 设置设备像素比(关键步骤)
    m_backgroundImage.setDevicePixelRatio(ratio);
    
    // 5. DEBUG输出
    qDebug() << "[DEBUG] Background Image Info:"
             << "\n   Original Size:" << pixmap.size()
             << "\n   Target Size:" << targetSize
             << "\n   Widget Size:" << size()
             << "\n   Device Pixel Ratio:" << ratio
             << "\n   Result Size:" << m_backgroundImage.size()
             << "/" << m_backgroundImage.devicePixelRatio();

    m_hasBackground = true;
    update();
}

关键改进点

  1. 使用 devicePixelRatioF()

    • 替换原来的 devicePixelRatio(),提供更精确的浮点数值
  2. 预计算目标尺寸

    • size() * ratio 提前计算物理像素尺寸
  3. 高质量缩放参数

    • Qt::SmoothTransformation 确保插值算法质量
  4. 正确设置设备像素比

    • setDevicePixelRatio()必须在缩放后调用

HiDPI适配建议

在应用程序启动时添加:

// main.cpp
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);      // 启用自动HiDPI缩放
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);         // 高分辨率图片支持

Paint事件中的绘制优化

确保在paintEvent中正确绘制:

void WhiteBoard::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    
    if (m_hasBackground) {
        // HiDPI兼容绘制方式
        painter.drawPixmap(rect(), m_backgroundImage, 
                         QRectF(0,0,m_backgroundImage.width(),m_backgroundImage.height()));
        
        /* 
        或者使用更精确的控制:
        QRectF destRect(0,0,width(),height());
        QRectF srcRect(0,0,m_backgroundImage.width(),m_backgroundImage.height());
        painter.drawPixmap(destRect, m_backgroundImage, srcRect);
        */
    }
    
    // ...其他绘制内容...
}

额外检查项

  1. 原始图片分辨率

    qDebug() << "Original DPI:" << pixmap.dotsPerMeterX()*0.0254;
    
  2. 系统DPI设置

    qDebug() << "Screen DPI:" << screen()->logicalDotsPerInch();
    
  3. 尝试禁用缩放测试

    // Test code:
    m_backgroundImage = pixmap; //不使用缩放直接显示原图看是否清晰
    

如果仍然模糊,可能需要:

  • 提供更高分辨率的原始图片(至少是控件最大预期尺寸的2倍)
  • 检查显示器是否为Retina/HiDPI屏幕需要特殊适配


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?