【问题标题】:Display a QGraphicsItem several times多次显示一个 QGraphicsItem
【发布时间】:2020-07-28 01:24:44
【问题描述】:

我需要管理具有大量静态项目的场景,但有些项目将是相同的,但在 10k+ 不同的坐标处。例如,有一个圆圈,但在场景中绘制了 10k 次。

我找到的唯一解决方案是为同一个视口使用 2 个场景,这显然不是我需要的解决方案,因为我需要许多简单的对象。 使用 QGraphicsScene/QgraphicView 可以做到这一点吗?

【问题讨论】:

  • 我建议以 Qt 的40000 chip demo 为例进行学习
  • 在本例中,创建了 40000 个筹码。我的问题是,是否可以实例化一个对象然后放置 40000 次。我认为这会占用更少的内存。

标签: qt qgraphicsview qgraphicsitem qgraphicsscene


【解决方案1】:

是否可以实例化一个对象然后将其放置 40000 次

不,Qt 不能这样工作。这就像问你是否可以同时在两个地方。

Qt 被设计为高效,因此如果您有多个对象,例如具有相同资源图像的QGraphicsPixmapItem,它可以对所有项目使用相同的图像。但是,一个项目在任何时候只能位于场景中的一个位置。

所以,在圆的情况下,绘制 10000 次,您可以创建 10000 个图形项,全部使用相同的 QPixmap 资源,即圆。但是,您仍然需要创建 10000 个项目,因为每个项目都必须在某处存储其坐标和方向;那就是 QGraphicsItem。

假设我们用圆圈实例化了一个 QPixmap 项:

QPixmap* pCircle = new QPixmap(":/images/circle"); // circle from the resource system

我们现在可以在不同的位置创建 10000 个项目,每个项目都使用该圆圈:

for(int i = 0; i<10000; ++i)
{
    QGraphicsPixmapItem* pItem = new QGraphicsPixmapItem(*pCircle);
    // set its position and add it to the scene
    pItem->setPos(x, y);
    m_pScene->addItem(pItem);
}

【讨论】:

  • 我有一个关于你的代码的问题,如果 pcirle 改变,pItem 也会改变吗?
  • 不,不会。如果您阅读有关 Qt 的 Implicit Sharing 的信息,您将更好地了解正在发生的事情。
  • 这会严重减慢或挂起 UI。如果你以毫秒为间隔继续这样做
  • @taimoor1990,请解释“毫秒间隔”,因为显示的源中没有时间。
  • 假设您最初添加了 10k 个图形项并根据您的代码将它们绘制在场景中。现在的问题是,如果您在每 500 毫秒后获得新职位。这些重新初始化会占用太多 UI 线程时间,因此会阻塞 Ui。这是我对问题的理解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2021-07-08
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多