QPainter-рисование может быть очень медленным без аппаратной поддержки. Использование QGraphicsView не поможет, если все строки видны, так как он все равно использует QPainter.
Если вам просто нужно нарисовать 20 новых точек (или линий) для каждого обновления, а фон для каждого обновления будет очищен, поэтому вам придется рендерить все заново, есть несколько вещей, которые вы можете попробовать:
1) Отключить автозаполнение фона. Смотрите: QWidget :: autoFillBackground
Добавьте что-то подобное в ваш виджет 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 приносит много новых проблем.