2012-06-21 30 views
3

我試圖製作一個媒體播放器。軌道的時間狀態使用QSlider顯示。當用戶在QSlider的某處釋放滑塊時,應該發生追蹤查找。我看了一下QSlider信號列表。似乎適合的是sliderReleased(),當用戶釋放滑塊時會發生這種情況,但它不會獲得滑塊所在位置的最新值。所以爲了得到滑塊的最新值,我使用了sliderMoved()和存儲引用。qslider sliderReleaseased value

信號和槽連接

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信號不會給出滑塊掉落的值,但是它給出滑塊移動的位置。如何獲得滑塊掉落的值?

+0

[文檔](http://qt-project.org/doc/qt-4.8/qabstractslider.html#sliderMoved)表示'sliderMoved'信號發出滑塊的新值。嘗試在'searchSliderMoved'內執行'value = search_percent',而不是像當前那樣查詢小部件。 – tmpearce

+0

是的,我試了一下,但有這個問題,它不斷髮送新的值,即使當用戶拖動滑塊。 –

+7

也許你想把'tracking'屬性設置爲'false'並且使用'valueChanged'信號(當'tracking == false'時,它只會在用戶放下滑塊時發出)。 – tmpearce

回答

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. 
    } 
} 
1

有同樣的問題和處理sliderReleased()爲我工作時調用的sliderPosition(),而不是直接value()

2

您可以使用滑塊的valueChanged(int)信號,但設置標誌

ui->horizontalSlider->setTracking(false); 
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 
}