如何移动部分QGraphicsItem的像素?

时间:2015-09-16 12:41:12

标签: qt graphics qt4 pixel qgraphicsitem

我想知道是否可以通过复制其像素而不是重绘它来移动部分图形。

我在嵌入式环境中工作,性能是关键因素。我们使用Qt 4.8。

我想要绘制一组实时数据点。我定义了以下类:

class SetOfDataPoints : public QGraphicsItem
{
public:
  <constructor>
  QRectF boundingRect() const { ... }
  void paint(QPainter* painter,
             const QStyleOptionGraphicsItem* option,
             QWidget* widget = NULL) { ... }
  <other methods>
};

我定期读取新数据点,将其添加到SetOfDataPoints的实例,然后将SetOfDataPoints移到左侧(通过调用QGraphicsItem::moveBy() {{1} }),所以新的数据点变得可见。结果,SetOfDataPoints被调用,在该方法中,我必须绘制整个数据点集。该图形目前仅包含连接数据点的线段,但将来会更加精细。

现在,当大部分图形实际上只是向左移动时,重绘整个数据点集会感觉效率低下。我想将图表未更改部分的像素向左移动,并仅绘制连接最后两个点的一个线段。至少我想尝试一下,并测量一下可以提高性能的程度。

在Qt 4.8中有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这一般不起作用:

  1. 您的项目在呈现之前不会像任何像素一样存在。您不知道它被绘制了多少像素,或者即使有任何像素,因为您的场景显示的视图有0个或更多,并且该项可能在这些视图上以不同程度可见。

  2. 您的商品已应用转化。它不必是矩形的。

  3. 您的商品与其下方的商品合成,除非它完全不透明。

  4. 您在视图上显示的项目与视图所在的窗口小部件的后备存储区合成。

  5. 您可以针对特殊情况进行优化。如果您的项目未缓存,则它始终绘制在视图上,并且paint的widget参数将指向该窗口小部件。然后,您可以直接访问后备存储,并且画家会为您提供用于从项目坐标到后备存储的设备坐标的转换。然后,您可以检查窗口小部件树上的路径,从视图到窗口的不透明度。如果所有插入的小部件都绘制不透明,并且您的项目具有保持方向的转换,您当然可以对图像执行一个blit,并仅重绘项目的一小部分。

    如果您的商品 已缓存,则应将其缓存在设备坐标中。当你在像素图上画画时,你也可以做blitting。然后将该pixmap合成到视图所在窗口的后备存储上。每个视图都有一个单独的缓存像素图。

    当blitting时,您必须始终识别前面的像素有多少是正确的。对于每个视图或缓存pixmap,您应该保留一个有效的区域。该地区最初应该是空的。