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

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 移动时出现残影问题记录的文章就介绍到这了,更多相关Qt QGraphicsItem 移动残影内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源链接:https://www.jb51.net/program/322995pyw.htm
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END












暂无评论内容