优化QT中的画线

sar*_*nan 2 qt

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

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

每 100 毫秒我需要绘制 20 个点。本次绘制时间为8秒。我总共需要画 1600 分(总分代表有争议的路线)。

我正在使用 QTimer 每 100 毫秒调用一次该绘图。前几张图画得很快。在绘图的中间它变得缓慢。

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

请帮我解决这个问题。如果有人有示例代码,请提供。提前致谢。

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

Vir*_*rne 6

如果没有硬件支持,QPainter 绘图可能会非常慢。如果所有线条都可见,那么使用 QGraphicsView 将无济于事,因为它内部无论如何都使用 QPainter。

如果您每次更新只需绘制 20 个新点(或线),并且每次更新背景都会被清除,因此您必须重新渲染所有内容,那么您可以尝试以下几种方法:

1) 禁用后台自动填充。请参阅:QWidget::autoFillBackground 将类似的内容添加到您的小部件初始化中:

setAutoFillBackground(false);
setAttribute(Qt::WA_OpaquePaintEvent, true);
setAttribute(Qt::WA_NoSystemBackground, true);
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

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