使用Qt在图片上绘制许多标记

Draw many markers on a picture using Qt

本文关键字:绘制 许多标 Qt 使用      更新时间:2023-10-16

使用Qt在图片(本地地图)上绘制许多标记的有效方法是什么?

我正在使用QGraphicsview/scene,我需要标记是可选择和可拖动的。

我的问题可以通过使用Qt的40000芯片示例来精确地解决。在示例中,您可以放大和缩小。

当您缩小到最低级别(您可以看到所有芯片)时,一切都变得非常滞后(包括选择和拖动)。

我的代码是从芯片示例修改的,因此它具有相同的行为。我需要将许多项目(1000+)平滑地拖在一起。

关于如何改进这一点的任何建议?

我是否必须使用 OpenGL 痛苦地实现自己的绘图引擎?

关于如何改进这一点的任何建议?

从调试模式切换到发布模式可以大大改善这一点。

如果在拖动过程中仍然存在滞后,则可以禁用或限制移动部件的显示。

我尝试将以下代码添加到项目的绘制函数中:void Chip::p aint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){ Q_UNUSED(小部件);

QList<QGraphicsItem*>tempList =  this->scene()->items(this->boundingRect(),Qt::IntersectsItemShape,Qt::DescendingOrder,QTransform());
if(tempList.size()>5)
{
   for(int index = 4; index < tempList.size() ; index ++)
   {
       tempList.at(index)->setVisible(false);
   }
   this->scene()->update();
}
//...rest of the paint code in the example goes here...
}

我的理解:拖动导致的重绘成本 = LOD(细节级别)x 项目数

当我们将太多项目叠加在一起(项目数量很大)并且放大查看细节(LOD 很大)时,重绘变得昂贵。

保持低复杂度的一种可能方法是限制我们绘制的次数。我认为只画在上面的时间并保持其余部分不可见(因此,不被绘制)是有意义的。

不确定QT是否具有自动功能,可以自动以智能方式执行此操作。