Как получить прямой прыжок в Qslider без ущерба для производительности

Сейчас я создаю простой видеоплеер в QT.

Я создал слайдер, который связан с подключением к мультимедийному проигрывателю (он отвечает за запуск фильма вперед-назад), и я хочу, чтобы его перемещали щелчком мыши в любом месте слайда, а не просто перетаскивая курсор.

Я попытался сделать это, добавив свой собственный метод следующим образом:

class MySlider : public QSlider
{

protected:
  void mousePressEvent(QMouseEvent *event)
  {
      if (event->button() == Qt::LeftButton)
      {
          if (orientation() == Qt::Horizontal)
          {
              setValue(minimum() + (maximum() - minimum()) * (static_cast<float>(event->x()) / static_cast<float>(width())));
          }
          event->accept();
      }
      QSlider::mousePressEvent(event);
  }

};

Вот как я подключил слайд к плееру:

connect(player, &QMediaPlayer::durationChanged,pos_slider, &MySlider::setMaximum );
connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::setValue );

connect(pos_slider, &MySlider::sliderMoved, player, &QMediaPlayer::setPosition);
connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition );

Моя проблема в том, что теперь, когда фильм воспроизводится, возникает задержка (фильм зависает на несколько секунд каждые несколько секунд). По моему мнению, из-за этого дополнения я на самом деле оказываю гораздо большее давление на игрока, потому что он теперь добавил события для прослушивания и отправки.

Как я могу заставить слайдер двигаться так, чтобы не повредить производительности игрока? (Или уменьшите снижение производительности до минимума)

спасибо, йоко

п.с.

Центр проблемы в том, что я использую connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::setValue ); в медиаплеере, а также connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition ); это дублирование вызывает проблемы с производительностью, но я понятия не имею, как я могу избавиться от этого дублирования

1 ответ

Решение

Как вы указали сами, проблема (вероятно) связана с резонансом между QMediaPlayer::position а также MySlider::value,

Решение 1:

Таким образом, вы должны избегать изменения QMediaPlayer::position когда MySlider::value обновляется программно, т.е. не используется следующее соединение:

connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition );

Вместо этого вы должны использовать sliderReleased а также sliderMoved сигналы для обновления QMediaPlayer::position и позвонить QMediaPlayer::setPosition вручную внутри mousePressEvent (когда уместно).

Решение 2: (спасибо Карстен Куп)

Создайте свой собственный слот для обновления значения слайдера, когда QMediaPlayer::position изменено на блокирование излучающих сигналов.

connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::updateValueFromMediaPlayer );

void MySlider::updateValueFromMediaPlayer(int pos)
{
    blockSignals(true); 
    setValue(pos); 
    blockSignals(false);
}

Обратите внимание, что в этом случае вам не нужно следующее соединение:

connect(pos_slider, &MySlider::sliderMoved, player, &QMediaPlayer::setPosition);
Другие вопросы по тегам