3

我正在尝试制作媒体播放器。使用 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 中的“值”变量进行搜索

void MainWindow::searchSliderReleased()
{
    std::cout<<"Released: Slider value"<<value<<std::endl;

    emit search(value);//seek the track to location value
}

但上述技术的问题在于,sliderMoved 信号没有给出滑块下降的值,但它给出了滑块移动的位置。如何获得滑块掉落的值?

4

4 回答 4

3

您可以使用valueChanged(int)滑块的信号,但设置标志

ui->horizontalSlider->setTracking(false);
于 2015-11-03T15:01:34.067 回答
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.
    }   
}
于 2012-07-03T00:01:52.460 回答
2

有同样的问题并且在处理对我有用时直接打电话sliderPosition()而不是直接打电话。value()sliderReleased()

于 2015-10-15T15:45:20.000 回答
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
}
于 2017-04-30T20:09:58.063 回答