脚本之家

电脑版
提示:原网页已由神马搜索转码, 内容由www.jb51.net提供.
您的位置:首页软件编程C 语言→ Qt QGraphicsItem 移动残影

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++中的多态问题—理解虚函数表及多态实现原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
      2023-02-02
    • 这篇文章主要介绍了解决vscode下调试c/c++程序一闪而过(Windows),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
      2020-08-08
    • 这篇文章主要介绍了编写C语言程序进行进制转换的问题实例,文中附录了一个各种进制间的转换程序代码,需要的朋友可以参考下
      2015-08-08
    • 这篇文章主要为大家详细介绍了MFC实现漂亮界面之美化按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2019-02-02
    • 本篇文章主要介绍了c语言基于stdarg.h的可变参数函数的用法,详细的介绍了可变参数函数的详细用法和源码实例,有兴趣的可以了解一下
      2017-07-07
    • 大家好,本篇文章主要讲的是C语言函数栈帧的创建和销毁介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
      2021-12-12
    • 这篇文章主要为大家详细介绍了C++实现扫雷、排雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2020-05-05
    • 这篇文章主要为大家详细介绍了如何使用C/C++实现手写数字识别,分别处理 32*32 文本数据集和mnist 28*28 png数据集,感兴趣的小伙伴可以跟随小编一起了解一下
      2023-10-10
    • 这篇文章主要为大家详细介绍了C语言代码实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
      2020-02-02
    • 正则表达式在匹配字符串,验证输入合法性时经常用到.C++ 11标准库中已经支持了正则表达式,下面这篇文章主要给大家介绍了关于c++正则表达式的相关资料,需要的朋友可以参考下
      2023-04-04

    最新评论