在QQuickPaintedItem中保留以前绘制的数据



我有一个自定义的QML组件来绘制从QQuickPaintedItem派生的图。在绘制方法中,我遍历坐标列表并绘制它们。我的paint()如下

QRectF bounds = boundingRect();
float w = bounds.width();
float h = bounds.height();
float dx = w / listSize;
for(int i = 0; i < coordinatesList.size() - 1; ++i)
{
    QPointF m_p1(dx*i, (h/2)-(coordinatesList.at(i)*(h/4)));
    QPointF m_p2(dx*(i+1), (h/2)-(coordinatesList.at(i+1)*(h/4)));
    painter->drawLine(m_p1, m_p2);
}

有没有什么方法可以保留以前绘制的点,这样我就不必重新绘制整个点列表,而只需要重新绘制特定的点?

我现在不能测试它,但你可以在QPixmap 上画出所有的点

m_pixmap.fill();
QPainter buffer(&m_pixmap);
....
buffer->drawLine(...);
...

然后在CCD_ 4上绘制保存的像素图。

painter->drawPixmap(0, 0, m_pixmap);

在下一次绘制请求时,您只需绘制保存的QPixmap。只有当绘图发生变化时,才必须重新绘制QPixmap本身。

正如第一个答案所示,缓存是关键,然而,使用QPixmap默认情况下,这将使用光栅绘制器后端,这不是最佳的,因为这将涉及昂贵的ram到GPU ram传输。此外,虽然光栅绘制器提供了更好的质量,但它通常比GL后端慢。

如果效率是关键,那么正确的方法是使用QOpenGLFramebufferObject,用QPainterQOpenGLPaintDevice在其上绘制,并且在QQuickPaintedItem::paint()中,使用本地渲染在使用FBO目标本身的QQuickItem上绘制FBO。这将为您提供更好的绘画性能,并避免ram到vram传输的开销。

此外,在处理绘图组件时,最好将图形划分开来,例如,网格或比例等内容应该是单独的组件,因为它们不需要不断重新绘制,只需要绘制实际波形并在顶部组合。

相关内容

  • 没有找到相关文章

最新更新