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

 更新时间:2024年06月20日 11:13:18   作者:求知向道  
自定义QGraphicsItem时,绘制rect,对象移动时出现残影的问题记录,本文给大家介绍Qt QGraphicsItem 移动时出现残影问题记录,感兴趣的朋友跟随小编一起看看吧

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 移动时出现残影问题记录的文章就介绍到这了,更多相关Qt QGraphicsItem 移动残影内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++友元函数和友元类的使用与区别

    C++友元函数和友元类的使用与区别

    本文主要介绍了C++友元函数和友元类的使用与区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现

    这篇文章主要介绍了C语言数据结构之顺序数组的实现的相关资料,这里提供实现实例,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • 详解C语言中的#define宏定义命令用法

    详解C语言中的#define宏定义命令用法

    有的时候为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用就是方便程序段的定义和修改,下面就来详解C语言中的#define宏定义命令用法.
    2016-05-05
  • C++超详细讲解函数对象

    C++超详细讲解函数对象

    在c++中,我们把所有能当作函数使用的对象统称为函数对象。它是实现operator()的任何类型,此运算符被称为调用运算符,当调用此操 作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象
    2022-06-06
  • C语言中fgetgrent()函数和fgetpwent()函数的用法对比

    C语言中fgetgrent()函数和fgetpwent()函数的用法对比

    这篇文章主要介绍了C语言中fgetgrent()函数和fgetpwent()函数的用法对比,分别用于读取组格式函数和读取密码格式,需要的朋友可以参考下
    2015-08-08
  • 详解C++中的数据抽象

    详解C++中的数据抽象

    这篇文章主要介绍了详解C++中的数据抽象,数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节,需要的朋友可以参考下
    2023-05-05
  • C语言返回值指针的函数详解

    C语言返回值指针的函数详解

    这篇文章主要为大家详细介绍了C语言返回值指针的函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言线性表顺序表示及实现

    C语言线性表顺序表示及实现

    这篇文章主要介绍了C语言线性表顺序表示及实现,线性表是最常用且最简单的一种数据结构。简而言之,一个线性表是n个数据元素的有限序列
    2022-07-07
  • 一篇文章带你入门C语言:数组

    一篇文章带你入门C语言:数组

    这篇文章主要介绍了C语言中数组的一些基本知识小结,其中重点是对于数组的内存分配相关方面的知识整理,需要的朋友可以参考下
    2021-08-08
  • C语言中的初阶指针详解

    C语言中的初阶指针详解

    这篇文章主要介绍了C语言中的初阶指针,介绍了其相关概念,具有一定参考价值。需要的朋友可以了解下,希望能够给你带来帮助
    2021-10-10

最新评论