开发者

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

开发者 https://www.devze.com 2024-08-14 12:20 出处:网络 作者: 求知向道
目录1.问题现象2.问题原因3.修改方案1.问题现象 自定义 QGraphicsItem 时,绘制rect,对象移动时出现残影。
目录
  • 1.问题现象
  • 2.问题原因
  • 3.修改方案

1.问题现象

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

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

2.问题原因

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

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

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

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

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

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

3.修改方案

boundingRect的左上角顶点,需要补充画笔http://www.devze.com宽度/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, 20js0), 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->setBrPKqCvAkokdush(m_clrBrush);
    painter->drawEllipse(0, 0, m_rectWidth, m_rectHeight);
}

到此这篇关于Qt QGraphicsItem 移动时出现残影问题记录的文章就介绍到这了,更多相关Qt QGraphicsItem 移动残影内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号