ZBLOG

m_image 是一个 QPixmap,下面代码的 painter.fillRect(rect_trans, Qt::transparent); 并不能使该区域透明?但是 m_image->fill(Qt::transparent); 有效? // 背景透明 m_image->fill(Qt::transparent); // if (m_pointPressed != UtilUi::POINT_INVALID && m...

在你的代码中,使用 QPainter 在一个 QPixmap 上进行绘制时,你发现 painter.fillRect(rect_trans, Qt::transparent); 不能使该区域透明,而 m_image->fill(Qt::transparent); 有效。这是因为在图像上填充透明色的方式和预期行为有所不同。

原因

  1. QPixmap 的特性QPixmap 是用于高效显示的位图,尤其是在窗口系统中。对其进行填充操作(如用透明颜色填充)并不会产生期望的效果,因为透明颜色不会从视觉上”删除”现有的像素。相反,使用 fill() 方法直接将整个图像区域设置为透明,这种方法是有效的。

  2. Alpha 通道:虽然你可以通过 fillRect 绘制任何颜色,包括带有 alpha 值的颜色,但如果你希望某个区域真正变得“透明”,这需要确保 QPixmap 支持 alpha 通道,并且需要正确处理这些绘制操作。

解决方案

为了实现预期效果,有以下几种解决方案:

  1. 清空矩形区域: 如果要在特定区域内应用透明效果,可以考虑先创建一个新的 QImage 或者使用现有的,不断更新这个图片而不是直接绘制到 pixmap 上。可以这样做:

    QImage tmpImage = m_image->toImage();
    QPainter painter(&tmpImage);
    painter.fillRect(rect_trans, Qt::transparent);
    m_image->convertFromImage(tmpImage);
    
  2. 利用 Alpha Blend: 考虑调整当前代码逻辑,使用半透明遮罩等其他方法来模拟透过的效果。例如,用较低的不完全不透明度填充覆盖区域。

  3. 确保支持 Alpha 通道: 确保你的 QPixmap 创建方式允许包含 alpha 通道。如果必要,可以将其替换为支持 alpha 的格式,例如用 QImage.

修改后的代码示例

如果只是想要把指定区域“擦除”成透明,你可以尝试如下修改:

// 背景透明
m_image->fill(Qt::transparent);

if (m_pointPressed != UtilUi::POINT_INVALID && m_pointReleased != UtilUi::POINT_INVALID) {
    static const QColor COLOR_COVER("#30000000"); // 遮罩的颜色
    
    // 将 m_image 转换为 QImage (保证支持 alpha)
    QImage image = m_image->toImage();

    //
    QPainter painter(&image);
    
    // 绘制遮盖
    QRect rect_cover(100, 100, image.width(), image.height());
    painter.fillRect(rect_cover, COLOR_COVER);

    // 绘制“擦除”指定区域为透明
    QRect rect_trans(m_pointPressed, m_pointReleased);
    painter.fillRect(rect_trans, Qt::transparent); 

    // 将结果重新转换回 QPixmap
    *m_image = QPixmap::fromImage(image);
}

这种方式应该能得到你所需的效果,即在指定区域变成“完全”透明。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?