Как получить прямой прыжок в 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);