QSlider 、 QTimer 和 valueChanged 用法
QSlider , QTimer and valueChanged usage
我尝试同时使用 QSlider、QTimer 和 valueChanged() 信号,但我需要区分滑块的值是由用户还是计时器滴答更改的。我怎样才能做到这一点?通过下面的代码,我尝试确定滑块何时被计时器更改,但我无法确定用户何时更改信号。 (此外,它是一个 OpenGL 动画,即使时间轴每隔 30 Hz 播放一次动画,滑块的行为就像时间轴一样,因此如果用户想使用滑块来制作动画向前或向后,我需要检查滑块的信号。但是滑块有 1 秒的滴答声定时器)
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);
}
}
您可以使用 QObject::sender 获取指向发出信号的 QObject 的指针。
我尝试了 sender 和 blocksignals 后,还是无法解决问题。因此,我找到了另一个更原始的滑块处理程序解决方案,如下所示。但是,我仍然认为 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;
}
我尝试同时使用 QSlider、QTimer 和 valueChanged() 信号,但我需要区分滑块的值是由用户还是计时器滴答更改的。我怎样才能做到这一点?通过下面的代码,我尝试确定滑块何时被计时器更改,但我无法确定用户何时更改信号。 (此外,它是一个 OpenGL 动画,即使时间轴每隔 30 Hz 播放一次动画,滑块的行为就像时间轴一样,因此如果用户想使用滑块来制作动画向前或向后,我需要检查滑块的信号。但是滑块有 1 秒的滴答声定时器)
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);
}
}
您可以使用 QObject::sender 获取指向发出信号的 QObject 的指针。
我尝试了 sender 和 blocksignals 后,还是无法解决问题。因此,我找到了另一个更原始的滑块处理程序解决方案,如下所示。但是,我仍然认为 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;
}