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 に答える