如何在不损坏性能的情况下直接跳转Qslider

时间:2017-09-19 19:08:10

标签: qt qtmultimedia qt-events

我现在正在QT中创建一个简单的视频播放器。

我创建了一个与Connect连接到多媒体播放器(他负责来回运行电影)的滑块,我希望通过鼠标单击幻灯片上的任何位置来移动它,而不仅仅是通过拖动光标

我尝试通过添加我自己的方法来完成此操作:

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 );

我的问题是,现在当电影正在播放时,存在延迟(电影每隔几秒就会挂起几秒钟)。在我看来,由于这个增加,我实际上给玩家施加了更大的压力,因为他现在已经添加了要监听和发送的事件。

如何让滑块以不会损害播放器性能的方式移动? (或者将性能降低降至最低)

谢谢你 阳子

P.S。

问题的中心是我在媒体播放器中使用connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::setValue );以及connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition );,这种重复导致了性能问题,但我不知道如何摆脱这种重复< / p>

1 个答案:

答案 0 :(得分:0)

正如您自己指出的那样,问题(可能)是QMediaPlayer::positionMySlider::value之间的共鸣。

解决方案1:

因此,当QMediaPlayer::position以编程方式更新时,您应避免更改MySlider::value,即不要使用以下连接:

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

相反,您应该使用sliderReleasedsliderMoved信号更新QMediaPlayer::position并在QMediaPlayer::setPosition内手动调用mousePressEvent(适当时)。

解决方案2:(非常感谢Karsten Koop)

创建自己的插槽,以便在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);