【问题标题】:qslider sliderReleased valueqslider 滑块释放值
【发布时间】:2012-06-23 06:39:29
【问题描述】:

我正在尝试制作媒体播放器。使用 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 信号没有给出滑块下降的值,但它给出了滑块移动的位置。如何获取滑块掉落的值?

【问题讨论】:

  • documentation for QSlider 表示sliderMoved 信号发出滑块的新值。尝试在searchSliderMoved 中执行value = search_percent,而不是像当前那样查询小部件。
  • 是的,我试过了,但是有一个问题是它不断发送新值,即使用户拖动滑块也是如此。
  • 也许您想将tracking 属性设置为false 并使用valueChanged 信号(当tracking==false 时,它仅在用户放下滑块时发出)。

标签: c++ qt qslider


【解决方案1】:

我更喜欢保存我们的应用设置的最后一个值,比如这个伪代码:

// 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
}

【讨论】:

    【解决方案2】:

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

    ui->horizontalSlider->setTracking(false);
    

    【讨论】:

      【解决方案3】:

      遇到同样的问题,在处理 sliderReleased() 时直接调用 sliderPosition() 而不是 value() 对我有用。

      【讨论】:

      • 这对我来说是正确的答案,因为我使用的是setTracking(false)
      【解决方案4】:

      刚刚在工作中使用 QSlider 构建了 DiectShow 媒体播放器。这里有一些关于我是如何做到的 slot sn-ps。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多