繁体   English   中英

在QGraphicsPolygonItem中显示文本而不将std :: string复制到QString?

[英]Display text inside QGraphicsPolygonItem without copying std::string to QString?

我正在使用QGraphicsScene绘制数百万个多边形。 我计划稍后使用Qt + OpenGL,但是目前我绘制的多边形不超过一百万个,而Qt可以很好地处理它。 当我尝试在多边形内显示文本时会出现问题。

每个多边形(继承QGraphicsPolygonItem的自定义类)是对象的直观表示,并具有指向与该对象关联的对象的指针。 每个对象都有一个std::string标识符。 如果我可以简单地在多边形内显示字符串,则应在内存方面使用。 但是,Qt似乎需要QString来代替,并且转换每个字符串都花费大量的时间和空间。 我为每个多边形创建一个QGraphicsTextObject,每个多边形都需要std::stringQString副本。 有什么方法可以仅使用Qt绕过此副本吗?

裁剪场景是不可取的。 有些多边形太小而无法容纳任何文本,只能通过放大场景才能看到它们。 这些多边形(及其文本)无需显示(除非用户放大),但我认为如果不先创建其他各种问题,这将无济于事。

PS:可以按需显示文本(例如,当用户将鼠标悬停在每个多边形上时),但是如果文本易于显示,则是理想的选择。

您是否进行了分析,以查看转换是否实际上是您的瓶颈? 字体渲染不是很快,如果真的尝试渲染数百万个文本,那将会很慢。 您不会绕过字符串转换,我唯一想到的就是优化何时进行转换以及执行频率。

首先,我考虑使用一个自定义项,或者通过重新实现QGraphicsItem :: paint手动绘制文本,或者从例如QGraphicsSimpleTextItem派生,这比直接使用QGraphicsSimpleTextItem甚至是QGraphicsTextItem进行更多的调整,这两者都需要您调用setText()从而预先转换字符串。

要注意的一件事是何时完成转换。 使用自定义项,您无需在调用setText()时就进行std :: string到QString的转换,但是您可以存储std :: string并按需仅在paint()中进行操作实现,即首先转换paint()调用然后进行缓存。

另一个可能昂贵的计算是boundingRect()。 可以通过返回实际文本形状的不太精确的近似值来进行调整。 如果返回的矩形比实际绘制的矩形大一点,那也没有什么坏处,只是不应该更小。 因此,可以使用一个硬编码的高度*大约。 字母宽度+一些填充。

然后,根本不绘制的文本甚至更便宜。 如果将视图缩小,则将绘制10 ^ 6项(然后才调用paint()),那么将很难阅读任何文本。 我将重新实现paint()并利用QGraphicsView的详细程度机制(请参阅此处 ),只是不转换字符串,也不绘制任何低于特定细节/缩放级别的内容。

如果可以使用Qt 5.4,则QGraphicsScene :: minimumRenderSize也可能会派上用场。 但是,如果不将其与上述其他建议结合使用,就无法避免字符串转换或boundingRect()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM