Воспроизведение графика в реальном времени

Всем привет, у меня приложение для редактирования и воспроизведения графиков.

В главном окне есть 3 виджета которые должны обновляться при воспроизведении: QGraphicsView в котором есть айтемы показывающие значение общим цветом (scheme_view_), QWidget с переопределенным paintEvent который показывает значения каждого канала на текущее время (channel_widget_) и еще один QGraphicsView с текущим графиком у которого есть просто курсор текущего времени.

Код воспроизведения одного кадра выглядит так:

QElapsedTimer timer;
timer.start();

if (current_time_ >= end_time_)
  current_time_ = start_time_;

OnSetTime(current_time_);

qDebug() << timer.elapsed();

cursor_time_label_->setText(QString::number(current_time_)); /* qlabel с значением текущего времени */
if (graphic_editor->isVisible()) /* редактор графика */
  graphic_editor->SetCursorTime(current_time_);

qDebug() << timer.elapsed();

int elapsed(timer.elapsed());
if (elapsed < 4)
  elapsed = 4;

current_time_ += elapsed * play_speed_factor_;

там есть play_speed_factor_, но он почти не влияет на полет, только если совсем мелкий график и кадр займет меньше 4 мс, но прям идеально точного реал тайма не нужно. код метода OnSetTime:

current_time_ = time;

/******* цикл заполнения каналов ******************/

if (scheme_view_->isVisible())  /* QGraphicsView */
  scheme_view_->repaint();

if (channel_widget_->isVisible())  /* QWidget with reimpl paintEvent */
  channel_widget_->repaint();

и метод graphic_editor->SetCursorTime(current_time_):

qreal pos = ms * background_item_->rect().width() / duration_;
cursor_item_->setX(pos);
repaint();

такой код дает если не реалтайм, то +- его, но только пока переменная current_time_ не входит в границы редактора графика.

Вывод qDebug() дает следующие значения: пока время не в границах редактора - 42/52, когда внутри редактора - 7/16, то есть меньше чем потратилось по факту и визуально воспроизведение сильно замедляется, если убрать установку времени в редакторе, то проблема устранится.

цикл заполнения значений занимает меньше 1 мс, текущее время я считаю в миллисекундах, если сделать вместо repaint вызов update у всех этих виджетов, то QElapsedTimer вернет 0, надо учитывать время потраченное на перерисовку каждого кадра, есть ли возможность это сделать?


Ответы (0 шт):