[问题记录]Qt QGraphicsItem 移动时出现残影

目录

1.问题现象

2.问题原因

3.修改方案


1.问题现象

自定义 QGraphicsItem 时,绘制rect,对象移动时出现残影。

2.问题原因

直接原因是view未刷新的问题,所以网上有人使用方案 setViewportUpdateMode(QGraphicsView::FullViewportUpdate); 的方案,但当图片过多时,此方案会造成画面闪烁,耗费资源等问题。

而根本原因是,boundingRect返回大小的问题,存在两种情况:

(1)boundingRect 返回的大小,不能完全包含实际图形大小,导致刷新不全

(2)boundingRect的左上角顶点位置、长宽,未补全画笔宽度,导致原因同(1)

boundingRect函数功能,是将图形项的外部边界定义为一个矩形。所有的绘图操作都必须限制在图形的边界矩形中,QGraphicsView需要使用这个边界来确定重绘的区域。

而边界的宽度,精确为画笔宽度的的一半。

3.修改方案

boundingRect的左上角顶点,需要补充画笔宽度/2,实际矩形的长宽,补全画笔宽度

cpp 复制代码
QRectF CGraphicsDragItem::boundingRect() const
{
    return QRectF(
        -m_penWidth/2,
        -m_penWidth/2,
        m_rectWidth+m_penWidth,
        m_rectHeight+m_penWidth);
}

void CGraphicsDragItem::paint(
    QPainter *painter,
    const QStyleOptionGraphicsItem *option,
    QWidget *widget)
{
    Q_UNUSED(option);
    Q_UNUSED(widget);

    if (hasFocus() || !collidingItems().isEmpty())
    {
        m_penWidth = 10;
        painter->setPen(QPen(QColor(255, 255, 255, 200), m_penWidth));
        if (hasFocus())
        {
            for (auto it : collidingItems())
            {
                it->update();
            }
        }
    }
    else
    {
        m_penWidth = 1;
        painter->setPen(QPen(QColor(100, 100, 100, 100), m_penWidth));
    }

    painter->setBrush(m_clrBrush);
    painter->drawEllipse(0, 0, m_rectWidth, m_rectHeight);
}
相关推荐
知识分享小能手26 分钟前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
熊猫钓鱼>_>29 分钟前
开源鸿蒙平台 KMP 三方库 kotlin-csv 适配全流程:从编码假设到沙箱真机互通验证
开发语言·人工智能·华为·kotlin·harmonyos·鸿蒙
张张123y35 分钟前
# 后端第七课:FastAPI 实战入门(用刚学的 Python 写第一个 API 接口)
开发语言·python·mysql·api·fastapi
小陈不好吃1 小时前
Java 泛型与类型擦除:从 PECS 原则到 TypeToken 绕过
java·开发语言·windows·pecs 原则·typetoken绕过
Shaoshing1 小时前
存储引擎与架构
java·开发语言·架构
额额额对了1 小时前
Linux 驱动开发:基于 platform 总线 + misc 设备的 DS18B20 单总线温度驱动
linux·c语言·开发语言·驱动开发·嵌入式硬件
devilnumber1 小时前
Java 代理模式(简单理解回顾)
java·开发语言·代理模式
invicinble2 小时前
对服务器资源的理解--理解用户请求,部署,服务器资源相关的映射层
开发语言
漫步人生走在路上2 小时前
用小语种SEO突破外贸B2B天花板:法语、德语市场的实测数据
开发语言·前端·javascript·人工智能·搜索引擎·ecmascript
yuniko-n2 小时前
【JUC】线程池
java·开发语言