当前位置: 首页> 教育> 锐评 > [问题记录]Qt QGraphicsItem 移动时出现残影

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

时间:2025/7/16 5:31:42来源:https://blog.csdn.net/Otosu/article/details/139787558 浏览次数:2次

目录

1.问题现象

2.问题原因

3.修改方案


1.问题现象

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

ec04162f14e34ac48f9dd191f6293d20.png

2.问题原因

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

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

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

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

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

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

3.修改方案

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

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);
}

 

关键字:[问题记录]Qt QGraphicsItem 移动时出现残影

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: