Оптимизированное рисование линий в QT - PullRequest
0 голосов
/ 15 ноября 2010

Я новичок в QT. Я работаю над графикой.

Я использую QWidget для рисования графики (Для рисования графики в событии рисования QWidget). Мне нужно нарисовать фон и графику переднего плана. Фон исправлен графикой. на переднем плане я рисую линии.

Каждые 100 миллисекунд мне нужно рисовать 20 точек. Это время рисования составляет 8 сек. Всего мне нужно сделать 1600 очков (сумма баллов представляет собой спорную линию).

Я использую QTimer для вызова этого чертежа каждые 100 мс. Первые несколько рисунков нарисованы очень быстро. в середине рисунка это становится медленным.

проблема в том, что мне нужно рисовать весь передний план и фон каждые 100 мс.

Пожалуйста, помогите мне решить проблему. если у кого-то есть образец кода, пожалуйста, предоставьте. Заранее спасибо.

Есть ли способ нарисовать только частичную область т.е. только конкретный модифицированный регион графики?

1 Ответ

3 голосов
/ 15 ноября 2010

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 приносит много новых проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...