Воспроизведение графика в реальном времени
Всем привет, у меня приложение для редактирования и воспроизведения графиков.
В главном окне есть 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, надо учитывать время потраченное на перерисовку каждого кадра, есть ли возможность это сделать?