如何在不损害性能的情况下直接跳转QSlider
How to get a direct jump in QSlider without damaging performance
我现在正在用 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 );
我的问题是现在播放电影时有延迟(电影每隔几秒就挂几秒)。在我看来,因为这个添加,我实际上给玩家增加了很多压力,因为他现在已经添加了监听和发送的事件。
如何才能让滑块以不损害播放器性能的方式移动? (或将性能下降降到最低)
谢谢
洋子
p.s.
问题的核心是我在媒体播放器中使用了 connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::setValue );
并且还使用了 connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition );
,这种重复导致了性能问题,但我不知道如何摆脱它重复
正如您自己指出的那样,问题(可能)是由于 QMediaPlayer::position
和 MySlider::value
之间的共振引起的。
解决方案一:
因此,您应该避免在以编程方式更新 MySlider::value
时更改 QMediaPlayer::position
,即不要使用以下连接:
connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition );
相反,您应该使用 sliderReleased
和 sliderMoved
信号来更新 QMediaPlayer::position
并在 mousePressEvent
中手动调用 QMediaPlayer::setPosition
(适当时)。
解决方案 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);
我现在正在用 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 );
我的问题是现在播放电影时有延迟(电影每隔几秒就挂几秒)。在我看来,因为这个添加,我实际上给玩家增加了很多压力,因为他现在已经添加了监听和发送的事件。
如何才能让滑块以不损害播放器性能的方式移动? (或将性能下降降到最低)
谢谢 洋子
p.s.
问题的核心是我在媒体播放器中使用了 connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::setValue );
并且还使用了 connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition );
,这种重复导致了性能问题,但我不知道如何摆脱它重复
正如您自己指出的那样,问题(可能)是由于 QMediaPlayer::position
和 MySlider::value
之间的共振引起的。
解决方案一:
因此,您应该避免在以编程方式更新 MySlider::value
时更改 QMediaPlayer::position
,即不要使用以下连接:
connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition );
相反,您应该使用 sliderReleased
和 sliderMoved
信号来更新 QMediaPlayer::position
并在 mousePressEvent
中手动调用 QMediaPlayer::setPosition
(适当时)。
解决方案 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);