2

我尝试同时使用 QSlider、QTimer 和 valueChanged() 信号,但我需要区分滑块的值是由用户更改还是由计时器刻度更改。我怎样才能做到这一点?通过下面的代码,我尝试确定计时器何时更改滑块,但我无法确定用户何时更改信号。(此外,它是一个 OpenGL 动画,滑块的行为类似于时间轴,即使时间轴每隔一秒动画播放 30 Hz 就改变一次值,因此如果用户想使用滑块来制作正向或反向动画,我需要检查滑块的信号。但是滑块从一秒开始计时器)

connect(timer, SIGNAL(timeout()), this,SLOT(timerTick()));
connect(slider, SIGNAL(valueChanged(int)),this, SLOT(sliderChange()));

void MainWindow::sliderChange()
{
  if (userInterrupt)
  {
   .. Call Function A
  }
}
void MainWindow::timerTick()
{
  slider->setValue(slider.value()+1);
  userInterrupt=false;
}

编辑:添加了发件人,但由于递归,它无法清楚地运行。我仍然无法决定信号

 connect(timer, SIGNAL(timeout()), this,SLOT(sliderChange()));
 connect(slider, SIGNAL(valueChanged(int)),this, SLOT(sliderChange()));

void MainWindow::sliderChange()
{
 QObject * obj =sender();
 if (obj==slider)
  {
   .. Call Function A
  }else
  {
  slider->setValue(slider.value()+1);
  }
}
4

2 回答 2

1

在尝试发送者和块信号后,我无法解决问题。因此,我在滑块处理程序上找到了另一个更原始的解决方案,如下所示。但是,我仍然认为 sender 和 blocksignal 是更好的解决方法并尝试以这种方式进行操作,直到下面的代码解决我的问题。基本上,我使用不同的信号来释放、单击和拖动滑块。

connect(timer, SIGNAL(timeout()), this,SLOT(timerTick()));
connect(slider, SIGNAL(valueChanged(int)),this, SLOT(sliderChange()));
connect(slider, SIGNAL(sliderReleased()),this, SLOT(userRelease()));
connect(slider, SIGNAL(sliderPressed()),this, SLOT(userClick()));

void MainWindow::sliderChange()
{
 // Action when it is changes
// in my case calculate time where animation will resume on
// but do not show any data on animation until release
// release slot will deal with it
}

void MainWindow::userClick()
{
 // Actions when mouse button is pressed 
// in my case pause animation
}
void MainWindow::userRelease()
{
// Action when mouse button is released
// in my case resume showing animation with slider value
} 
void MainWindow::timerTick()
{
  slider->setValue(slider.value()+1);
  userInterrupt=false;
}
于 2015-04-17T21:23:42.760 回答
1

您可以使用 QObject::sender 获取指向发出信号的 QObject 的指针。

于 2015-04-16T21:35:21.313 回答