QT中优化的线条图

时间:2010-11-15 10:34:54

标签: qt

我是QT的新手。我正在研究图形。

我正在使用QWidget绘制图形(用于在QWidget绘制事件中绘制图形)。我需要绘制背景和前景图形。背景是固定图形。前景我是画线。

每100毫秒我需要绘制20个点。此绘图时间为8秒。总计我需要绘制1600点(总点数代表有争议的线)。

我正在使用QTimer在每100毫秒调用此绘图。最初的几张画很快。在绘图的中间,它变得缓慢。

问题是我需要在每100毫秒绘制所有前景和背景。

请帮我解决问题。如果有任何人有示例代码请提供。提前谢谢。

有没有办法只绘制部分区域,即。只有图形的特定修改区域?

1 个答案:

答案 0 :(得分:3)

没有硬件支持,QPainter-drawing可能会非常慢。如果所有行都可见,使用QGraphicsView将无济于事,因为它无论如何都在内部使用QPainter。

如果你只需要为每次更新绘制20个新点(或行),并且每次更新背景都会被清除,所以你必须再次渲染所有内容,你可以尝试一些事情:

1)禁用后台自动填充。请参阅:QWidget::autoFillBackground 将这样的内容添加到您的widget init:

setAutoFillBackground(false);
setAttribute(Qt::WA_OpaquePaintEvent, true);
setAttribute(Qt::WA_NoSystemBackground, true);

现在第一次更新渲染背景和第一行。对于下一次更新,只需跳过渲染背景并仅渲染新行。

2)使用双缓冲。例如,创建小部件大小的QImage。

.h
private:
  QImage m_targetImage;


.cpp
  // constructor
    m_targetImage = QImage(width(), height(), QImage::Format_ARGB32); 

  // paint event

   // draw to image
   QPainter p;
   p.begin(&m_targetImage);
   static bool firstUpdate = true;
   if (firstUpdate)
   { 
    // draw background)
    p.drawImage(...);
    firstUpdate = false;
   }

   // draw latest lines
   p.drawLines(....);
   p.end();

   // draw image in widget paint
   QPainter painter;
   painter.begin(this);
   painter.drawImage(0, 0, m_targetImage);
   painter.end();

3)尽可能使用QGLWidget。从QGLWidget而不是QWidget继承您的小部件。此方法不适用于所有平台,速度增加可能还不够。使用OpenGL也会带来各种新问题。