我正在尝试制作媒体播放器。使用QSlider显示轨道的时间状态。当用户在QSlider上的某个位置释放滑块时,应该进行跟踪搜索。我查看了QSlider信号列表。似乎适合的是sliderReleased(),它发生在用户释放滑块时,但它没有获得滑块所在的最新值。因此,为了获得滑块最新值,我使用了sliderMoved()和存储引用。
信号和插槽连接
connect(this->ui->songProgress, SIGNAL(sliderMoved(int)), this,
SLOT(searchSliderMoved(int)));
connect(this->ui->songProgress, SIGNAL(sliderReleased()), this,
SLOT(searchSliderReleased()));
功能
void MainWindow::searchSliderMoved(int search_percent)
{
value=this->ui->songProgress->value();
std::cout<<"Moved: Slider value"<<value<<std::endl;
}
现在我在searchSliderReleased中使用“value”变量来寻找
void MainWindow::searchSliderReleased()
{
std::cout<<"Released: Slider value"<<value<<std::endl;
emit search(value);//seek the track to location value
}
但是上述技术的问题是,sliderMoved信号没有给出滑块被丢弃的值,但它给出了滑块移动位置的位置。如何获取滑块被删除的值?
答案 0 :(得分:3)
您可以使用滑块的valueChanged(int)
信号,但设置标志
ui->horizontalSlider->setTracking(false);
答案 1 :(得分:2)
刚刚在工作中使用QSlider完成了DiectShow媒体播放器的制作。这里有一些关于我如何做的插槽片段。
Widget::sliderPressed()
{
if( isPlaying() )
{
m_wasPlaying = true;
pause();
}
else
{
m_wasPlaying = false;
}
// Set a flag to denote slider drag is starting.
m_isSliderPressed = true;
}
Widget::sliderReleased()
{
if( m_wasPlaying )
{
play();
}
m_wasPlaying = false;
m_isSliderPressed = false;
}
Widget::valueChanged( int value )
{
if( m_isSliderPressed )
{
// Do seeking code here
}
else
{
// Sometime Qt when the user clicks the slider
// (no drag, just a click) Qt will signals
// pressed, released, valueChanged.
// So lets handle that here.
}
}
答案 2 :(得分:1)
在处理sliderPosition()
为我工作时,遇到同样的问题并直接致电value()
而不是sliderReleased()
。
答案 3 :(得分:0)
我更喜欢保存应用程序设置的最后一个值,例如这个伪代码:
// Save our last value
lastSoftwareVal = 0;
// Set value from program
slider_set_value(value){
lastSoftwareVal = value;
slider.setValue(value)
}
// Slider on change callback
slider_on_change(value){
if(value == lastSoftwareVal){
// Value was changed by our app
return false;
}
// User has changed the value, do something
}