《QT从基础到进阶·二十二》QGraphicsView显示大量图形项item导致界面卡顿的解决办法

有时候因业务需要,paint函数在界面上绘制了成百上千个图形项Items,导致操作界面的时候有明显的卡顿感,下文会提供一种比较好的解决办法,先来了解下QGraphicsItem的缓存方式。

cpp 复制代码
(1)setCacheMode(QGraphicsItem::NoCache);  //默认方式,无缓存,实时进入paint刷新重绘

(2)setCacheMode(QGraphicsItem::CacheBackground); //只缓存背景(背景色或背景图片),前景仍然需要重新计算。

(3)setCacheMode(QGraphicsItem::DeviceCoordinateCache); //将整个项缓存在设备坐标系中,并且只有在位置、大小或外观发生变化时才需要重新计算。这是最常用和最有效的缓存模式(项目较少使用旋转、缩放、剪切)

(4)setCacheMode(QGraphicsItem::ItemCoordinateCache );  //项目较多使用旋转,缩放,剪切等功能,但图形呈现质量较差。

在Item调用方式3或者直接在item构造中设置方式3能有效避免界面卡顿问题,如果图形项涉及大量的旋转,缩放,剪切,则方式3效果会和方式1差不多,基本没啥效果,界面依旧卡顿,这时就应该用方式4。

请注意,在某些情况下使用缓存可能会导致问题。例如,如果您的项的位置或大小经常更改,则需要清除该项的缓存以确保正确性。可以通过调用invalidate()函数来清除该项的缓存:

cpp 复制代码
item->setPos(0, 0); //修改位置
item->invalidate(); //清除缓存

总结:

如果你的 QGraphicsItem::paint 操作过于复杂,并且大部分是静态的,那么尝试启用缓存.如果您没有对项目或 ItemCoordinateCache 应用转换(如旋转),请使用 DeviceCoordinateCache.避免经常调用 QGraphicsItem::update() ,否则它会比没有缓存更慢。如果您需要更改项目中的某些内容,两个选项是:在子项中绘制它,或使用 QGraphicsView::drawForeground()前景层。

📢博客主页: 主页

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 梦回阑珊 原创,首发于 CSDN,转载注明出处🙉

📢代码改变世界,你来改变代码!✨

相关推荐
程序猿阿森9 小时前
Python 闭包与装饰器:从入门到精通
开发语言·python·面试
余额瞒着我当琳9 小时前
C++--vector底层,leetcode118杨辉三角实战,对于传统reserve的坑点,迭代器失效
开发语言·c++
曹牧9 小时前
C#:字符串做20位截断
开发语言·c#
醉城夜风~9 小时前
(超详细)C++多态(Polymorphism)
开发语言·c++
这是个栗子9 小时前
【JS代码分析】前端鉴权基础:Token 的本地存储与状态重置实践
开发语言·前端·javascript
wuyk55510 小时前
7.AVL 树:第一个自平衡二叉搜索树
开发语言·stm32·单片机·算法
小小龙学IT10 小时前
现代 C++ 内存管理与资源安全深度解析:从 RAII 到所有权模型
c++·安全
SomeB1oody10 小时前
【RustyML入门】5.3. 聚类指标
开发语言·后端·机器学习·rust·教程
欧特克_Glodon10 小时前
OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图
c++·人工智能·opencv·计算机视觉
OPEN-F10 小时前
Python进阶教程:Web开发入门(Flask)
开发语言·python